diff options
author | Tor Norbye <tnorbye@google.com> | 2013-08-15 15:44:44 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2013-08-15 16:41:52 -0700 |
commit | 08600181b2f24618135923b6159eac5e45d963b5 (patch) | |
tree | 0702eb3cac4e88f147ed472f6039d16a0dfbac9c /java | |
parent | d679193f6abc72710352d6f1678b572236651caf (diff) | |
parent | a3c36999a717e0d9923378ca5e0ae1160118c1e6 (diff) | |
download | idea-08600181b2f24618135923b6159eac5e45d963b5.tar.gz |
Merge remote-tracking branch 'aosp/snapshot-master' into merge
Change-Id: Ida4276d7d9013fd01d1c74ae5f206d3af7e98e95
Diffstat (limited to 'java')
81 files changed, 616 insertions, 544 deletions
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/ProblemsViewImpl.java b/java/compiler/impl/src/com/intellij/compiler/impl/ProblemsViewImpl.java index e625dc16e5a3..27f61c47ff24 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/ProblemsViewImpl.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/ProblemsViewImpl.java @@ -21,7 +21,6 @@ import com.intellij.ide.errorTreeView.ErrorTreeElement; import com.intellij.ide.errorTreeView.ErrorViewStructure; import com.intellij.ide.errorTreeView.GroupingElement; import com.intellij.openapi.Disposable; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.compiler.CompileScope; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; @@ -36,9 +35,9 @@ import com.intellij.util.concurrency.SequentialTaskExecutor; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.ide.PooledThreadExecutor; import java.util.UUID; -import java.util.concurrent.Executor; /** * @author Eugene Zhuravlev @@ -48,12 +47,7 @@ public class ProblemsViewImpl extends ProblemsView{ private static final String PROBLEMS_TOOLWINDOW_ID = "Problems"; private final ProblemsViewPanel myPanel; - private final SequentialTaskExecutor myViewUpdater = new SequentialTaskExecutor(new Executor() { - @Override - public void execute(Runnable command) { - ApplicationManager.getApplication().executeOnPooledThread(command); - } - }); + private final SequentialTaskExecutor myViewUpdater = new SequentialTaskExecutor(new PooledThreadExecutor()); public ProblemsViewImpl(final Project project, final ToolWindowManager wm) { super(project); diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/ProblemsViewPanel.java b/java/compiler/impl/src/com/intellij/compiler/impl/ProblemsViewPanel.java index d65451eab82c..618774541686 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/ProblemsViewPanel.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/ProblemsViewPanel.java @@ -25,12 +25,13 @@ public class ProblemsViewPanel extends NewErrorTreeViewPanel { myTree.getEmptyText().setText("No compilation problems found"); } - + @Override protected void fillRightToolbarGroup(DefaultActionGroup group) { super.fillRightToolbarGroup(group); group.add(new CompilerPropertiesAction()); } + @Override protected void addExtraPopupMenuActions(DefaultActionGroup group) { group.add(new ExcludeFromCompileAction(myProject, this)); // todo: do we need compiler's popup actions here? @@ -51,5 +52,4 @@ public class ProblemsViewPanel extends NewErrorTreeViewPanel { protected boolean canHideWarnings() { return false; } - -} +}
\ No newline at end of file diff --git a/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java b/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java index add20bda9b65..35091f75238e 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java @@ -34,11 +34,11 @@ import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.Channels; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.ide.PooledThreadExecutor; import org.jetbrains.jps.api.CmdlineProtoUtil; import org.jetbrains.jps.api.CmdlineRemoteProto; import java.util.*; -import java.util.concurrent.Executor; /** * @author Eugene Zhuravlev @@ -50,12 +50,7 @@ public abstract class DefaultMessageHandler implements BuilderMessageHandler { private final Project myProject; private int myConstantSearchesCount = 0; private final CachingSearcher mySearcher; - private final SequentialTaskExecutor myTaskExecutor = new SequentialTaskExecutor(new Executor() { - @Override - public void execute(Runnable command) { - ApplicationManager.getApplication().executeOnPooledThread(command); - } - }); + private final SequentialTaskExecutor myTaskExecutor = new SequentialTaskExecutor(new PooledThreadExecutor()); protected DefaultMessageHandler(Project project) { myProject = project; diff --git a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugEnvironment.java b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugEnvironment.java index e0f463eccf90..5a842e420a0d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugEnvironment.java +++ b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugEnvironment.java @@ -20,15 +20,12 @@ import com.intellij.execution.ExecutionResult; import com.intellij.execution.Executor; import com.intellij.execution.configurations.*; import com.intellij.execution.filters.ExceptionFilters; -import com.intellij.execution.filters.Filter; import com.intellij.execution.filters.TextConsoleBuilder; import com.intellij.execution.runners.ProgramRunner; import com.intellij.execution.runners.RunContentBuilder; import com.intellij.openapi.project.Project; import com.intellij.psi.search.GlobalSearchScope; -import java.util.List; - /** * Created by IntelliJ IDEA. * User: michael.golubev @@ -65,10 +62,7 @@ public class DefaultDebugEnvironment implements DebugEnvironment { if (myState instanceof CommandLineState) { final TextConsoleBuilder consoleBuilder = ((CommandLineState)myState).getConsoleBuilder(); if (consoleBuilder != null) { - List<Filter> filters = ExceptionFilters.getFilters(mySearchScope); - for (Filter filter : filters) { - consoleBuilder.addFilter(filter); - } + consoleBuilder.filters(ExceptionFilters.getFilters(mySearchScope)); } } return myState.execute(myExecutor, myRunner); diff --git a/java/debugger/impl/src/com/intellij/debugger/apiAdapters/TransportServiceWrapper.java b/java/debugger/impl/src/com/intellij/debugger/apiAdapters/TransportServiceWrapper.java index 84a4679919ba..d6670355019a 100644 --- a/java/debugger/impl/src/com/intellij/debugger/apiAdapters/TransportServiceWrapper.java +++ b/java/debugger/impl/src/com/intellij/debugger/apiAdapters/TransportServiceWrapper.java @@ -18,14 +18,11 @@ package com.intellij.debugger.apiAdapters; import com.intellij.execution.ExecutionException; import com.intellij.openapi.diagnostic.Logger; import com.intellij.util.ArrayUtil; -import com.sun.jdi.connect.Transport; +import com.sun.jdi.connect.spi.TransportService; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; /** * @author max @@ -33,113 +30,28 @@ import java.util.Map; public class TransportServiceWrapper { private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.apiAdapters.TransportService"); - private final Object myDelegateObject; - private final Class myDelegateClass; + private final TransportService myTransport; + private final Class<? extends TransportService> myDelegateClass; private static final String SOCKET_TRANSPORT_CLASS = "com.sun.tools.jdi.SocketTransportService"; private static final String SHMEM_TRANSPORT_CLASS = "com.sun.tools.jdi.SharedMemoryTransportService"; - private final Map<String, Object> myListenAddresses = new HashMap<String, Object>(); - - private TransportServiceWrapper(Class delegateClass) throws NoSuchMethodException, + private TransportServiceWrapper(Class<? extends TransportService> delegateClass) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { myDelegateClass = delegateClass; final Constructor constructor = delegateClass.getDeclaredConstructor(ArrayUtil.EMPTY_CLASS_ARRAY); constructor.setAccessible(true); - myDelegateObject = constructor.newInstance(ArrayUtil.EMPTY_OBJECT_ARRAY); - } - - /** - * Applicable if IDEA is run on JDK 1.4.2.x only! - * @param transportObj - */ - private TransportServiceWrapper(Transport transportObj) { - myDelegateClass = transportObj.getClass(); - myDelegateObject = transportObj; - } - - public ConnectionServiceWrapper attach(final String s) throws IOException { - try { - // Applicable if IDEA is run on JDK 1.4.2.x only! - // in JDK 1.5 the signature of the "attach" method has been changed to "attach(String, long, long)" - //noinspection HardCodedStringLiteral - final Method method = myDelegateClass.getMethod("attach", new Class[]{String.class}); - method.setAccessible(true); - return new ConnectionServiceWrapper(method.invoke(myDelegateObject, new Object[]{s})); - } - catch (NoSuchMethodException e) { - LOG.error(e); - } - catch (IllegalAccessException e) { - LOG.error(e); - } - catch (InvocationTargetException e) { - final Throwable cause = e.getCause(); - if (cause instanceof IOException) { - throw (IOException)cause; - } - LOG.error(e); - } - return null; + myTransport = (TransportService)constructor.newInstance(ArrayUtil.EMPTY_OBJECT_ARRAY); } - public String startListening() throws IOException { - try { - //noinspection HardCodedStringLiteral - final Method method = myDelegateClass.getMethod("startListening", ArrayUtil.EMPTY_CLASS_ARRAY); - method.setAccessible(true); - final Object rv = method.invoke(myDelegateObject, ArrayUtil.EMPTY_OBJECT_ARRAY); - // important! do not cast to string cause return types differ in jdk 1.4 and jdk 1.5 - final String strValue = rv.toString(); - myListenAddresses.put(strValue, rv); - return strValue; - } - catch (NoSuchMethodException e) { - LOG.error(e); - } - catch (IllegalAccessException e) { - LOG.error(e); - } - catch (InvocationTargetException e) { - final Throwable cause = e.getCause(); - if (cause instanceof IOException) { - throw (IOException)cause; - } - LOG.error(e); - } - return null; + public TransportService.ListenKey startListening() throws IOException { + return myTransport.startListening(); } - public void stopListening(final String address) throws IOException { - try { - Object value = myListenAddresses.get(address); - if (value == null) { - value = address; - } - Class paramClass = value.getClass(); - for (Class superClass = paramClass.getSuperclass(); !Object.class.equals(superClass); superClass = superClass.getSuperclass()) { - paramClass = superClass; - } - //noinspection HardCodedStringLiteral - final Method method = myDelegateClass.getMethod("stopListening", new Class[] {paramClass}); - method.setAccessible(true); - method.invoke(myDelegateObject, new Object[]{value}); - } - catch (NoSuchMethodException e) { - LOG.error(e); - } - catch (IllegalAccessException e) { - LOG.error(e); - } - catch (InvocationTargetException e) { - final Throwable cause = e.getCause(); - if (cause instanceof IOException) { - throw (IOException)cause; - } - LOG.error(e); - } + public void stopListening(final TransportService.ListenKey address) throws IOException { + myTransport.stopListening(address); } @SuppressWarnings({"HardCodedStringLiteral"}) @@ -147,11 +59,10 @@ public class TransportServiceWrapper { if (SOCKET_TRANSPORT_CLASS.equals(myDelegateClass.getName())) { return "dt_socket"; } - else if (SHMEM_TRANSPORT_CLASS.equals(myDelegateClass.getName())) { + if (SHMEM_TRANSPORT_CLASS.equals(myDelegateClass.getName())) { return "dt_shmem"; } - - LOG.error("Unknown serivce"); + LOG.error("Unknown service"); return "<unknown>"; } @@ -160,14 +71,14 @@ public class TransportServiceWrapper { try { try { if (forceSocketTransport) { - transport = new TransportServiceWrapper(Class.forName(SOCKET_TRANSPORT_CLASS)); + transport = new TransportServiceWrapper((Class<? extends TransportService>)Class.forName(SOCKET_TRANSPORT_CLASS)); } else { - transport = new TransportServiceWrapper(Class.forName(SHMEM_TRANSPORT_CLASS)); + transport = new TransportServiceWrapper((Class<? extends TransportService>)Class.forName(SHMEM_TRANSPORT_CLASS)); } } catch (UnsatisfiedLinkError ignored) { - transport = new TransportServiceWrapper(Class.forName(SOCKET_TRANSPORT_CLASS)); + transport = new TransportServiceWrapper((Class<? extends TransportService>)Class.forName(SOCKET_TRANSPORT_CLASS)); } } catch (Exception e) { @@ -176,13 +87,4 @@ public class TransportServiceWrapper { return transport; } - /** - * Applicable if IDEA is run on JDK 1.4.2.x only! - * @param transportObject - * @return transport service wrapper - */ - public static TransportServiceWrapper getTransportService(Transport transportObject){ - return new TransportServiceWrapper(transportObject); - } - } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java index 4a05b02dd898..d8c754476ad4 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java @@ -19,7 +19,6 @@ import com.intellij.Patches; import com.intellij.debugger.*; import com.intellij.debugger.actions.DebuggerActions; import com.intellij.debugger.apiAdapters.ConnectionServiceWrapper; -import com.intellij.debugger.apiAdapters.TransportServiceWrapper; import com.intellij.debugger.engine.evaluation.*; import com.intellij.debugger.engine.events.DebuggerCommandImpl; import com.intellij.debugger.engine.events.SuspendContextCommandImpl; @@ -544,23 +543,7 @@ public abstract class DebugProcessImpl implements DebugProcess { myDebugProcessDispatcher.getMulticaster().connectorIsReady(); try { - if (SOCKET_ATTACHING_CONNECTOR_NAME.equals(connector.name()) && Patches.SUN_JDI_CONNECTOR_HANGUP_BUG) { - String portString = myConnection.getAddress(); - String hostString = myConnection.getHostName(); - - if (hostString == null || hostString.isEmpty()) { - //noinspection HardCodedStringLiteral - hostString = "localhost"; - } - hostString += ":"; - - final TransportServiceWrapper transportServiceWrapper = TransportServiceWrapper.getTransportService(connector.transport()); - myConnectionService = transportServiceWrapper.attach(hostString + portString); - return myConnectionService.createVirtualMachine(); - } - else { - return connector.attach(myArguments); - } + return connector.attach(myArguments); } catch (IllegalArgumentException e) { throw new CantRunException(e.getLocalizedMessage()); diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsImpl.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsImpl.java index 6be6899d6bb0..0f368bfb031f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsImpl.java @@ -38,6 +38,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiExpression; import com.intellij.util.net.NetUtils; import com.sun.jdi.Value; +import com.sun.jdi.connect.spi.TransportService; import org.jdom.Element; import java.io.IOException; @@ -139,8 +140,9 @@ public class DebuggerUtilsImpl extends DebuggerUtilsEx{ } try { - String address = transportService.startListening(); - transportService.stopListening(address); + TransportService.ListenKey listenKey = transportService.startListening(); + final String address = listenKey.address(); + transportService.stopListening(listenKey); return address; } catch (IOException e) { diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/GenericDebuggerParametersRunnerConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/impl/GenericDebuggerParametersRunnerConfigurable.java index b36d0a4303fe..9d5d48146b62 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/GenericDebuggerParametersRunnerConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/GenericDebuggerParametersRunnerConfigurable.java @@ -25,6 +25,7 @@ import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.util.text.StringUtilRt; import com.intellij.ui.PortField; import com.intellij.xdebugger.impl.settings.DebuggerConfigurable; import org.jetbrains.annotations.NotNull; @@ -99,10 +100,6 @@ public class GenericDebuggerParametersRunnerConfigurable extends SettingsEditor< } @Override - public void disposeEditor() { - } - - @Override public void resetEditorFrom(GenericDebuggerRunnerSettings runnerSettings) { setIsLocal(runnerSettings.LOCAL); setTransport(runnerSettings.getTransport()); @@ -153,9 +150,8 @@ public class GenericDebuggerParametersRunnerConfigurable extends SettingsEditor< } private void checkPort() throws ConfigurationException { - final int port = myPortField.getNumber(); - if (isSocket() && port > 0 && (port < 0 || port > 0xffff)) { - throw new ConfigurationException(DebuggerBundle.message("error.text.invalid.port.0", port)); + if (isSocket() && !myPortField.isSpecified()) { + throw new ConfigurationException(DebuggerBundle.message("error.text.invalid.port")); } } @@ -172,7 +168,7 @@ public class GenericDebuggerParametersRunnerConfigurable extends SettingsEditor< private void setPort(String port) { if (isSocket()) { - myPortField.setNumber(StringUtil.parseInt(port, 0)); + myPortField.setNumber(StringUtilRt.parseInt(port, 0)); } else { myAddressField.setText(port); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java index c189e4b64dab..9ba63656d1f1 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java @@ -38,7 +38,6 @@ import com.intellij.execution.ExecutionResult; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.executors.DefaultDebugExecutor; import com.intellij.execution.filters.ExceptionFilters; -import com.intellij.execution.filters.Filter; import com.intellij.execution.filters.TextConsoleBuilder; import com.intellij.execution.filters.TextConsoleBuilderFactory; import com.intellij.execution.ui.ConsoleView; @@ -100,6 +99,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos final DebuggerSettings debuggerSettings = DebuggerSettings.getInstance(); if (!ApplicationManager.getApplication().isUnitTestMode()) { getContextManager().addListener(new DebuggerContextListener() { + @Override public void changeEvent(DebuggerContextImpl newContext, int event) { switch (event) { case DebuggerSession.EVENT_DETACHED: @@ -176,12 +176,14 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos } myUi.addListener(new ContentManagerAdapter() { + @Override public void selectionChanged(ContentManagerEvent event) { updateStatus(event.getContent()); } }, this); debuggerSession.getContextManager().addListener(new DebuggerContextListener() { + @Override public void changeEvent(DebuggerContextImpl newContext, int event) { if (!myUi.isDisposed()) { attractFramesOnPause(event); @@ -346,6 +348,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos } + @Override public void dispose() { disposeSession(); myFramesPanel.dispose(); @@ -452,10 +455,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos public void addThreadDump(List<ThreadState> threads) { final Project project = getProject(); final TextConsoleBuilder consoleBuilder = TextConsoleBuilderFactory.getInstance().createBuilder(project); - List<Filter> filters = ExceptionFilters.getFilters(myDebuggerSession.getSearchScope()); - for (Filter filter : filters) { - consoleBuilder.addFilter(filter); - } + consoleBuilder.filters(ExceptionFilters.getFilters(myDebuggerSession.getSearchScope())); final ConsoleView consoleView = consoleBuilder.getConsole(); final DefaultActionGroup toolbarActions = new DefaultActionGroup(); consoleView.allowHeavyFilters(); @@ -471,11 +471,13 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos myThreadDumpsCount += 1; myCurrentThreadDumpId += 1; Disposer.register(this, new Disposable() { + @Override public void dispose() { myUi.removeContent(content, true); } }); Disposer.register(content, new Disposable() { + @Override public void dispose() { myThreadDumpsCount -= 1; if (myThreadDumpsCount == 0) { @@ -494,15 +496,18 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos } private class MyDebuggerStateManager extends DebuggerStateManager { + @Override public void fireStateChanged(DebuggerContextImpl newContext, int event) { super.fireStateChanged(newContext, event); } + @Override public DebuggerContextImpl getContext() { final DebuggerSession session = myDebuggerSession; return session != null ? session.getContextManager().getContext() : DebuggerContextImpl.EMPTY_CONTEXT; } + @Override public void setState(DebuggerContextImpl context, int state, int event, String description) { final DebuggerSession session = myDebuggerSession; if (session != null) { @@ -519,6 +524,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos myAutoModeEnabled = DebuggerSettings.getInstance().AUTO_VARIABLES_MODE; } + @Override public void update(final AnActionEvent e) { super.update(e); final Presentation presentation = e.getPresentation(); @@ -526,10 +532,12 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos presentation.setText(autoModeEnabled ? "All-Variables Mode" : "Auto-Variables Mode"); } + @Override public boolean isSelected(AnActionEvent e) { return myAutoModeEnabled; } + @Override public void setSelected(AnActionEvent e, boolean enabled) { myAutoModeEnabled = enabled; DebuggerSettings.getInstance().AUTO_VARIABLES_MODE = enabled; @@ -551,6 +559,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos myTextUnavailable = DebuggerBundle.message("action.watches.method.return.value.unavailable.reason"); } + @Override public void update(final AnActionEvent e) { super.update(e); final Presentation presentation = e.getPresentation(); @@ -567,10 +576,12 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos } } + @Override public boolean isSelected(AnActionEvent e) { return myWatchesReturnValues; } + @Override public void setSelected(AnActionEvent e, boolean watch) { myWatchesReturnValues = watch; DebuggerSettings.getInstance().WATCH_RETURN_VALUES = watch; diff --git a/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurable.java b/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurable.java index c781a7f2304a..d7027dd5a517 100644 --- a/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurable.java +++ b/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurable.java @@ -40,7 +40,8 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class AppletConfigurable extends SettingsEditor<AppletConfiguration> implements CheckableRunConfigurationEditor<AppletConfiguration>, @@ -256,9 +257,6 @@ public class AppletConfigurable extends SettingsEditor<AppletConfiguration> impl return myWholePanel; } - public void disposeEditor() { - } - public void checkEditorData(final AppletConfiguration configuration) { configuration.MAIN_CLASS_NAME = toNull(getClassNameComponent().getText()); configuration.HTML_FILE_NAME = toSystemFormat(getHtmlPathComponent().getText()); diff --git a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java index 4fb04e2fd577..b72a8883636f 100644 --- a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java +++ b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java @@ -114,9 +114,6 @@ public class ApplicationConfigurable extends SettingsEditor<ApplicationConfigura return myWholePanel; } - public void disposeEditor() { - } - private void createUIComponents() { myMainClass = new LabeledComponent<EditorTextFieldWithBrowseButton>(); myMainClass.setComponent(new EditorTextFieldWithBrowseButton(myProject, true, new JavaCodeFragment.VisibilityChecker() { diff --git a/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurable.java b/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurable.java index cfcf4e1d29a9..5cfd535d081b 100644 --- a/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurable.java +++ b/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurable.java @@ -180,9 +180,6 @@ public class RemoteConfigurable extends SettingsEditor<RemoteConfiguration> { return myPanel; } - public void disposeEditor() { - } - private void updateHelpText() { boolean useSockets = !myRbShmem.isSelected(); diff --git a/java/execution/openapi/src/com/intellij/execution/JavaExecutionUtil.java b/java/execution/openapi/src/com/intellij/execution/JavaExecutionUtil.java index 2ac23b7e5be1..95a2c2d46e8b 100644 --- a/java/execution/openapi/src/com/intellij/execution/JavaExecutionUtil.java +++ b/java/execution/openapi/src/com/intellij/execution/JavaExecutionUtil.java @@ -25,7 +25,6 @@ import com.intellij.execution.runners.ProgramRunner; import com.intellij.execution.util.ExecutionErrorDialog; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; @@ -109,26 +108,28 @@ public class JavaExecutionUtil { myIcon = icon; } + @Override public Icon getIcon() { return myIcon; } + @Override public RunProfileState getState(@NotNull final Executor executor, @NotNull final ExecutionEnvironment env) throws ExecutionException { final JavaCommandLineState state = new JavaCommandLineState(env) { + @Override protected JavaParameters createJavaParameters() { return myParameters; } }; final TextConsoleBuilder builder = TextConsoleBuilderFactory.getInstance().createBuilder(myProject); if (myFilters != null) { - for (final Filter myFilter : myFilters) { - builder.addFilter(myFilter); - } + builder.filters(myFilters); } state.setConsoleBuilder(builder); return state; } + @Override public String getName() { return myContentName; } @@ -154,7 +155,7 @@ public class JavaExecutionUtil { } public static Module findModule(@NotNull final PsiClass psiClass) { - return ModuleUtil.findModuleForPsiElement(psiClass); + return ModuleUtilCore.findModuleForPsiElement(psiClass); } @Nullable diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java index 1f8ebc6fcd23..4465367d3c99 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java @@ -417,6 +417,7 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo } } + @NotNull private static LocalQuickFix[] wrapFix(LocalQuickFix fix) { if (fix == null) return LocalQuickFix.EMPTY_ARRAY; return new LocalQuickFix[]{fix}; diff --git a/java/java-impl/src/com/intellij/codeInspection/unusedImport/UnusedImportLocalInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/unusedImport/UnusedImportLocalInspection.java index a8feaf9c148e..362eb75c0160 100644 --- a/java/java-impl/src/com/intellij/codeInspection/unusedImport/UnusedImportLocalInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/unusedImport/UnusedImportLocalInspection.java @@ -17,7 +17,7 @@ package com.intellij.codeInspection.unusedImport; import com.intellij.codeInsight.daemon.GroupNames; -import com.intellij.codeInspection.BaseJavaLocalInspectionTool; +import com.intellij.codeInspection.BaseJavaBatchLocalInspectionTool; import com.intellij.codeInspection.InspectionsBundle; import com.intellij.codeInspection.ex.PairedUnfairLocalInspectionTool; import com.siyeh.ig.imports.UnusedImportInspection; @@ -28,7 +28,7 @@ import org.jetbrains.annotations.NotNull; * User: anna * Date: 17-Feb-2006 */ -public class UnusedImportLocalInspection extends BaseJavaLocalInspectionTool implements PairedUnfairLocalInspectionTool { +public class UnusedImportLocalInspection extends BaseJavaBatchLocalInspectionTool implements PairedUnfairLocalInspectionTool { @NonNls public static final String SHORT_NAME = "UNUSED_IMPORT"; public static final String DISPLAY_NAME = InspectionsBundle.message("unused.import"); diff --git a/java/java-impl/src/com/intellij/analysis/JavaAnalysisScope.java b/java/java-impl/src/com/intellij/analysis/JavaAnalysisScope.java index 7f645a5d4770..6899c7a1cf3d 100644 --- a/java/java-impl/src/com/intellij/analysis/JavaAnalysisScope.java +++ b/java/java-impl/src/com/intellij/analysis/JavaAnalysisScope.java @@ -31,6 +31,7 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PackageScope; import com.intellij.psi.search.SearchScope; import com.intellij.util.containers.ContainerUtil; +import com.siyeh.ig.psiutils.FileTypeUtils; import org.jetbrains.annotations.NotNull; import java.util.HashSet; @@ -56,7 +57,7 @@ public class JavaAnalysisScope extends AnalysisScope { final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(defaultProject).getFileIndex(); final HashSet<Module> modules = new HashSet<Module>(); if (myType == FILE) { - if (myElement instanceof PsiJavaFile && !JspPsiUtil.isInJspFile(myElement)) { + if (myElement instanceof PsiJavaFile && !FileTypeUtils.isInServerPageFile(myElement)) { PsiJavaFile psiJavaFile = (PsiJavaFile)myElement; final PsiClass[] classes = psiJavaFile.getClasses(); boolean onlyPackLocalClasses = true; @@ -83,7 +84,7 @@ public class JavaAnalysisScope extends AnalysisScope { return super.getNarrowedComplementaryScope(defaultProject); } - + @Override public String getShortenName() { diff --git a/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java b/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java index 0cb53dd805af..fe002f62dbc4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java @@ -43,6 +43,7 @@ import com.intellij.util.Consumer; import com.intellij.util.FilteredQuery; import com.intellij.util.Processor; import com.intellij.util.Query; +import com.siyeh.ig.psiutils.FileTypeUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -108,7 +109,7 @@ public class CodeInsightUtil { break; } if (parent instanceof PsiCodeBlock) break; - if (JspPsiUtil.isInJspFile(parent) && parent instanceof PsiFile) break; + if (FileTypeUtils.isInServerPageFile(parent) && parent instanceof PsiFile) break; if (parent instanceof PsiCodeFragment) break; if (parent == null || parent instanceof PsiFile) return PsiElement.EMPTY_ARRAY; parent = parent.getParent(); diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java index f74f6f9d6214..c32a30c0d985 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java @@ -32,6 +32,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.Processor; +import com.siyeh.ig.psiutils.FileTypeUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -265,7 +266,7 @@ public class HighlightControlFlowUtil { scope = PsiTreeUtil.getParentOfType(scope, PsiCodeBlock.class); } - topBlock = JspPsiUtil.isInJspFile(scope) && scope instanceof PsiFile ? scope : PsiUtil.getTopLevelEnclosingCodeBlock(expression, scope); + topBlock = FileTypeUtils.isInServerPageFile(scope) && scope instanceof PsiFile ? scope : PsiUtil.getTopLevelEnclosingCodeBlock(expression, scope); if (variable instanceof PsiField) { // non final field already initialized with default value if (!variable.hasModifierProperty(PsiModifier.FINAL)) return null; diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 7916c58e103b..5c59702b688f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -43,13 +43,10 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; -import com.intellij.psi.impl.source.jsp.jspJava.JspClass; -import com.intellij.psi.impl.source.jsp.jspJava.JspHolderMethod; import com.intellij.psi.impl.source.resolve.JavaResolveUtil; import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl; import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl; import com.intellij.psi.javadoc.PsiDocComment; -import com.intellij.psi.jsp.JspFile; import com.intellij.psi.scope.processor.VariablesNotProcessor; import com.intellij.psi.scope.util.PsiScopesUtil; import com.intellij.psi.search.GlobalSearchScope; @@ -64,6 +61,7 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.UIUtil; import com.intellij.xml.util.XmlStringUtil; +import com.siyeh.ig.psiutils.FileTypeUtils; import gnu.trove.THashMap; import org.intellij.lang.annotations.Language; import org.jetbrains.annotations.NonNls; @@ -484,7 +482,7 @@ public class HighlightUtil extends HighlightUtilBase { if (method == null && lambda != null) { //todo check return statements type inside lambda } - else if (method == null && !(parent instanceof JspFile)) { + else if (method == null && !(parent instanceof ServerPageFile)) { description = JavaErrorMessages.message("return.outside.method"); errorResult = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(description).create(); } @@ -697,11 +695,11 @@ public class HighlightUtil extends HighlightUtilBase { @Nullable private static HighlightInfoType getUnhandledExceptionHighlightType(final PsiElement element) { - if (!JspPsiUtil.isInJspFile(element)) { + if (!FileTypeUtils.isInServerPageFile(element)) { return HighlightInfoType.UNHANDLED_EXCEPTION; } PsiMethod targetMethod = PsiTreeUtil.getParentOfType(element, PsiMethod.class); - if (!(targetMethod instanceof JspHolderMethod)) return HighlightInfoType.UNHANDLED_EXCEPTION; + if (!(targetMethod instanceof SyntheticElement)) return HighlightInfoType.UNHANDLED_EXCEPTION; // ignore JSP top level errors - it handled by UnhandledExceptionInJSP inspection return null; } @@ -806,7 +804,7 @@ public class HighlightUtil extends HighlightUtilBase { if (PsiModifier.PUBLIC.equals(modifier)) { isAllowed = modifierOwnerParent instanceof PsiJavaFile || modifierOwnerParent instanceof PsiClass && - (modifierOwnerParent instanceof JspClass || ((PsiClass)modifierOwnerParent).getQualifiedName() != null); + (modifierOwnerParent instanceof PsiSyntheticClass || ((PsiClass)modifierOwnerParent).getQualifiedName() != null); } else if (PsiModifier.STATIC.equals(modifier) || PsiModifier.PRIVATE.equals(modifier) || PsiModifier.PROTECTED.equals(modifier) || PsiModifier.PACKAGE_LOCAL.equals(modifier)) { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 290633fc853a..5c9e198b578b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -36,7 +36,6 @@ import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.controlFlow.ControlFlowUtil; import com.intellij.psi.impl.source.javadoc.PsiDocMethodOrFieldRef; -import com.intellij.psi.impl.source.jsp.jspJava.JspClass; import com.intellij.psi.impl.source.resolve.JavaResolveUtil; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl; @@ -362,7 +361,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh @Override public void visitClass(PsiClass aClass) { super.visitClass(aClass); - if (aClass instanceof JspClass) return; + if (aClass instanceof PsiSyntheticClass) return; if (!myHolder.hasErrorResults()) myHolder.add(GenericsHighlightUtil.checkInterfaceMultipleInheritance(aClass)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightClassUtil.checkDuplicateTopLevelClass(aClass)); if (!myHolder.hasErrorResults()) myHolder.add(GenericsHighlightUtil.checkEnumMustNotBeLocal(aClass)); diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddMethodFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddMethodFix.java index 2021b1b646e8..aa7cdee64041 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddMethodFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddMethodFix.java @@ -96,12 +96,11 @@ public class AddMethodFix extends LocalQuickFixAndIntentionActionOnPsiElement { @NotNull PsiElement endElement) { final PsiClass myClass = (PsiClass)startElement; - return myMethodPrototype != null - && myMethodPrototype.isValid() - && myClass.isValid() - && myClass.getManager().isInProject(myClass) - && myText != null - && MethodSignatureUtil.findMethodBySignature(myClass, myMethodPrototype, false) == null + return myMethodPrototype.isValid() && + myClass.isValid() && + myClass.getManager().isInProject(myClass) && + myText != null && + MethodSignatureUtil.findMethodBySignature(myClass, myMethodPrototype, false) == null ; } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java index 5de72527f379..1a2683e39b31 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java @@ -46,6 +46,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashSet; +import com.siyeh.ig.psiutils.FileTypeUtils; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -287,7 +288,7 @@ public abstract class ImportClassFixBase<T extends PsiElement, R extends PsiRefe if (classes.length == 1 && (canImportHere = canImportHere(allowCaretNearRef, editor, psiFile, classes[0].getName())) - && (JspPsiUtil.isInJspFile(psiFile) ? + && (FileTypeUtils.isInServerPageFile(psiFile) ? CodeInsightSettings.getInstance().JSP_ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY : CodeInsightSettings.getInstance().ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY) && (ApplicationManager.getApplication().isUnitTestMode() || codeAnalyzer.canChangeFileSilently(psiFile)) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/LocateLibraryDialog.form b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/LocateLibraryDialog.form index ce18bcc96501..51a40ab236b6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/LocateLibraryDialog.form +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/LocateLibraryDialog.form @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.codeInsight.daemon.impl.quickfix.LocateLibraryDialog"> <grid id="cbd77" binding="contentPane" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1"> - <margin top="0" left="10" bottom="10" right="10"/> + <margin top="0" left="0" bottom="0" right="0"/> <constraints> <xy x="48" y="54" width="623" height="297"/> </constraints> @@ -14,7 +14,7 @@ <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="4" hsize-policy="7" anchor="1" fill="1" indent="0" use-parent-layout="false"/> </constraints> <properties/> - <border type="etched"/> + <border type="none"/> <children> <component id="feb4c" class="com.intellij.openapi.ui.TextFieldWithBrowseButton" binding="myLibraryFile"> <constraints> diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateClassOrPackageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateClassOrPackageFix.java index 735520aa44ce..5534f5fd6cc2 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateClassOrPackageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateClassOrPackageFix.java @@ -74,19 +74,20 @@ public class CreateClassOrPackageFix extends LocalQuickFixAndIntentionActionOnPs i.remove(); } } - return directories.isEmpty() ? null : new CreateClassOrPackageFix(directories, - context, - fixPath ? qualifiedName : redPart, - redPart, - kind, - superClass, - templateName); + return new CreateClassOrPackageFix(directories, + context, + fixPath ? qualifiedName : redPart, + redPart, + kind, + superClass, + templateName); } @Nullable public static CreateClassOrPackageFix createFix(@NotNull final String qualifiedName, @NotNull final PsiElement context, - @Nullable ClassKind kind, final String superClass) { + @Nullable ClassKind kind, + String superClass) { return createFix(qualifiedName, context.getResolveScope(), context, null, kind, superClass, null); } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateFieldOrPropertyFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateFieldOrPropertyFix.java index b63d8910a14b..956e57c0904f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateFieldOrPropertyFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateFieldOrPropertyFix.java @@ -52,7 +52,11 @@ public class CreateFieldOrPropertyFix implements IntentionAction, LocalQuickFix private final PropertyMemberType myMemberType; private final PsiAnnotation[] myAnnotations; - public CreateFieldOrPropertyFix(final PsiClass aClass, final String name, final PsiType type, final PropertyMemberType memberType, final PsiAnnotation[] annotations) { + public CreateFieldOrPropertyFix(final PsiClass aClass, + final String name, + final PsiType type, + @NotNull PropertyMemberType memberType, + final PsiAnnotation[] annotations) { myClass = aClass; myName = name; myType = type; diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/AntLikePropertySelectionHandler.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/AntLikePropertySelectionHandler.java index ffd75c7747c0..7b87a8cbcef6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/AntLikePropertySelectionHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/AntLikePropertySelectionHandler.java @@ -15,9 +15,10 @@ */ package com.intellij.codeInsight.editorActions.wordSelection; -import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandler; +import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandlerBase; import com.intellij.lang.Language; import com.intellij.lang.StdLanguages; +import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiComment; @@ -28,11 +29,11 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -public class AntLikePropertySelectionHandler implements ExtendWordSelectionHandler { +public class AntLikePropertySelectionHandler extends ExtendWordSelectionHandlerBase { @Override public boolean canSelect(PsiElement e) { Language l = e.getLanguage(); - if (!(l.equals(StdLanguages.JAVA) + if (!(l.equals(JavaLanguage.INSTANCE) || l.equals(StdLanguages.XML) || l.equals(StdLanguages.ANT))) { return false; diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithIfExpressionSurrounder.java b/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithIfExpressionSurrounder.java index 0c492c9e6acb..38fd5a9b62f6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithIfExpressionSurrounder.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithIfExpressionSurrounder.java @@ -24,6 +24,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.util.IncorrectOperationException; +import com.siyeh.ig.psiutils.FileTypeUtils; import org.jetbrains.annotations.NonNls; class JavaWithIfExpressionSurrounder extends JavaExpressionSurrounder{ @@ -35,7 +36,7 @@ class JavaWithIfExpressionSurrounder extends JavaExpressionSurrounder{ PsiElement parent = expr.getParent(); if (!(parent instanceof PsiExpressionStatement)) return false; final PsiElement element = parent.getParent(); - if (!(element instanceof PsiCodeBlock) && !(JspPsiUtil.isInJspFile(element) && element instanceof PsiFile)) return false; + if (!(element instanceof PsiCodeBlock) && !(FileTypeUtils.isInServerPageFile(element) && element instanceof PsiFile)) return false; return true; } diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithNullCheckSurrounder.java b/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithNullCheckSurrounder.java index aa258abd1bd1..c6a1221eced0 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithNullCheckSurrounder.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithNullCheckSurrounder.java @@ -24,6 +24,7 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; +import com.siyeh.ig.psiutils.FileTypeUtils; import org.jetbrains.annotations.NonNls; class JavaWithNullCheckSurrounder extends JavaExpressionSurrounder{ @@ -36,7 +37,7 @@ class JavaWithNullCheckSurrounder extends JavaExpressionSurrounder{ PsiElement parent = PsiTreeUtil.getParentOfType(expr, PsiExpressionStatement.class); if (parent == null) return false; final PsiElement element = parent.getParent(); - if (!(element instanceof PsiCodeBlock) && !(JspPsiUtil.isInJspFile(element) && element instanceof PsiFile)) return false; + if (!(element instanceof PsiCodeBlock) && !(FileTypeUtils.isInServerPageFile(element) && element instanceof PsiFile)) return false; return true; } diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java index c55a21b45991..6ba29bbc1c45 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java @@ -32,6 +32,7 @@ import org.jetbrains.annotations.Nullable; * @author cdr */ public class QuickFixFactoryImpl extends QuickFixFactory { + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createModifierListFix(@NotNull PsiModifierList modifierList, @NotNull String modifier, @@ -40,6 +41,7 @@ public class QuickFixFactoryImpl extends QuickFixFactory { return new ModifierFix(modifierList, modifier, shouldHave,showContainingClass); } + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createModifierListFix(@NotNull PsiModifierListOwner owner, @NotNull final String modifier, @@ -48,6 +50,7 @@ public class QuickFixFactoryImpl extends QuickFixFactory { return new ModifierFix(owner, modifier, shouldHave, showContainingClass); } + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createMethodReturnFix(@NotNull PsiMethod method, @NotNull PsiType toReturn, @@ -55,28 +58,33 @@ public class QuickFixFactoryImpl extends QuickFixFactory { return new MethodReturnTypeFix(method, toReturn, fixWholeHierarchy); } + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createAddMethodFix(@NotNull PsiMethod method, @NotNull PsiClass toClass) { return new AddMethodFix(method, toClass); } + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createAddMethodFix(@NotNull String methodText, @NotNull PsiClass toClass, - String... exceptions) { + @NotNull String... exceptions) { return new AddMethodFix(methodText, toClass, exceptions); } + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createImplementMethodsFix(@NotNull PsiClass aClass) { return new ImplementMethodsFix(aClass); } + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createImplementMethodsFix(@NotNull PsiElement psiElement) { return new ImplementMethodsFix(psiElement); } + @NotNull @Override public LocalQuickFixOnPsiElement createMethodThrowsFix(@NotNull PsiMethod method, @NotNull PsiClassType exceptionClass, @@ -85,16 +93,18 @@ public class QuickFixFactoryImpl extends QuickFixFactory { return new MethodThrowsFix(method, exceptionClass, shouldThrow, showContainingClass); } + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createAddDefaultConstructorFix(@NotNull PsiClass aClass) { return new AddDefaultConstructorFix(aClass); } @Override - public LocalQuickFixAndIntentionActionOnPsiElement createAddConstructorFix(@NotNull PsiClass aClass, String modifier) { + public LocalQuickFixAndIntentionActionOnPsiElement createAddConstructorFix(@NotNull PsiClass aClass, @NotNull String modifier) { return aClass.getName() != null ? new AddDefaultConstructorFix(aClass, modifier) : null; } + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createMethodParameterTypeFix(@NotNull PsiMethod method, int index, @@ -103,16 +113,19 @@ public class QuickFixFactoryImpl extends QuickFixFactory { return new MethodParameterFix(method, newType, index, fixWholeHierarchy); } + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createMakeClassInterfaceFix(@NotNull PsiClass aClass) { return new MakeClassInterfaceFix(aClass, true); } + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createMakeClassInterfaceFix(@NotNull PsiClass aClass, final boolean makeInterface) { return new MakeClassInterfaceFix(aClass, makeInterface); } + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createExtendsListFix(@NotNull PsiClass aClass, @NotNull PsiClassType typeToExtendFrom, @@ -120,11 +133,13 @@ public class QuickFixFactoryImpl extends QuickFixFactory { return new ExtendsListFix(aClass, typeToExtendFrom, toAdd); } + @NotNull @Override public LocalQuickFixAndIntentionActionOnPsiElement createRemoveUnusedParameterFix(@NotNull PsiParameter parameter) { return new RemoveUnusedParameterFix(parameter); } + @NotNull @Override public IntentionAction createRemoveUnusedVariableFix(@NotNull PsiVariable variable) { return new RemoveUnusedVariableFix(variable); @@ -142,8 +157,9 @@ public class QuickFixFactoryImpl extends QuickFixFactory { return CreateClassOrPackageFix.createFix(qualifiedName, context, createClass ? ClassKind.CLASS : ClassKind.INTERFACE, superClass); } + @NotNull @Override - public IntentionAction createCreateFieldOrPropertyFix(final PsiClass aClass, final String name, final PsiType type, final PropertyMemberType targetMember, final PsiAnnotation... annotations) { + public IntentionAction createCreateFieldOrPropertyFix(@NotNull final PsiClass aClass, @NotNull final String name, @NotNull final PsiType type, @NotNull final PropertyMemberType targetMember, @NotNull final PsiAnnotation... annotations) { return new CreateFieldOrPropertyFix(aClass, name, type, targetMember, annotations); } diff --git a/java/java-impl/src/com/intellij/ide/hierarchy/call/CallHierarchyNodeDescriptor.java b/java/java-impl/src/com/intellij/ide/hierarchy/call/CallHierarchyNodeDescriptor.java index 866e2cea0f5b..c465975f5a73 100644 --- a/java/java-impl/src/com/intellij/ide/hierarchy/call/CallHierarchyNodeDescriptor.java +++ b/java/java-impl/src/com/intellij/ide/hierarchy/call/CallHierarchyNodeDescriptor.java @@ -34,12 +34,13 @@ import com.intellij.openapi.util.TextRange; import com.intellij.pom.Navigatable; import com.intellij.psi.*; import com.intellij.psi.impl.source.jsp.jspJava.JspHolderMethod; -import com.intellij.psi.jsp.JspFile; import com.intellij.psi.presentation.java.ClassPresentationUtil; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtilBase; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.ui.LayeredIcon; +import com.siyeh.ig.psiutils.FileTypeUtils; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -146,8 +147,8 @@ public final class CallHierarchyNodeDescriptor extends HierarchyNodeDescriptor i myHighlightedText.getEnding().addText(buffer.toString(), mainTextAttributes); } } - else if (JspPsiUtil.isInJspFile(enclosingElement) && enclosingElement instanceof PsiFile) { - final JspFile file = JspPsiUtil.getJspFile(enclosingElement); + else if (FileTypeUtils.isInServerPageFile(enclosingElement) && enclosingElement instanceof PsiFile) { + final PsiFile file = PsiUtilCore.getTemplateLanguageFile(enclosingElement); myHighlightedText.getEnding().addText(file.getName(), mainTextAttributes); } else { @@ -156,7 +157,7 @@ public final class CallHierarchyNodeDescriptor extends HierarchyNodeDescriptor i if (myUsageCount > 1) { myHighlightedText.getEnding().addText(IdeBundle.message("node.call.hierarchy.N.usages", myUsageCount), HierarchyNodeDescriptor.getUsageCountPrefixAttributes()); } - if (!(JspPsiUtil.isInJspFile(enclosingElement) && enclosingElement instanceof PsiFile)) { + if (!(FileTypeUtils.isInServerPageFile(enclosingElement) && enclosingElement instanceof PsiFile)) { final PsiClass containingClass = enclosingElement instanceof PsiMethod ? ((PsiMethod)enclosingElement).getContainingClass() : (PsiClass)enclosingElement; diff --git a/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java b/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java index 08ecb6a716a4..6b1a322e9944 100644 --- a/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java +++ b/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java @@ -93,7 +93,7 @@ public class JavadocConfiguration implements ModuleRunProfile, JDOMExternalizabl } public RunProfileState getState(@NotNull final Executor executor, @NotNull final ExecutionEnvironment env) throws ExecutionException { - return new MyJavaCommandLineState(myProject, myGenerationScope); + return new MyJavaCommandLineState(myProject, myGenerationScope, env); } public String getName() { @@ -132,8 +132,8 @@ public class JavadocConfiguration implements ModuleRunProfile, JDOMExternalizabl private final Project myProject; @NonNls private static final String INDEX_HTML = "index.html"; - public MyJavaCommandLineState(Project project, AnalysisScope generationOptions) { - super(null); + public MyJavaCommandLineState(Project project, AnalysisScope generationOptions, ExecutionEnvironment env) { + super(env); myGenerationOptions = generationOptions; myProject = project; addConsoleFilters(new RegexpFilter(project, "$FILE_PATH$:$LINE$:[^\\^]+\\^"), diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java index 0fe403b84ff8..2822fcfc81f5 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java @@ -38,6 +38,7 @@ import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ContainerUtil; +import com.siyeh.ig.psiutils.FileTypeUtils; import gnu.trove.THashSet; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -157,7 +158,7 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager { Set<PsiImportStatementBase> allImports = new THashSet<PsiImportStatementBase>(Arrays.asList(imports)); final Collection<PsiImportStatementBase> redundant; - if (JspPsiUtil.isInJspFile(file)) { + if (FileTypeUtils.isInServerPageFile(file)) { // remove only duplicate imports redundant = ContainerUtil.newIdentityTroveSet(); ContainerUtil.addAll(redundant, imports); diff --git a/java/java-impl/src/com/intellij/psi/impl/source/tree/injected/JavaConcatenationInjectorManager.java b/java/java-impl/src/com/intellij/psi/impl/source/tree/injected/JavaConcatenationInjectorManager.java index 59e311a213a2..d485130ac7d4 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/tree/injected/JavaConcatenationInjectorManager.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/tree/injected/JavaConcatenationInjectorManager.java @@ -159,7 +159,7 @@ public class JavaConcatenationInjectorManager implements ModificationTracker { } if (result != null && result.getResult() != null) { for (Pair<Place, PsiFile> p : result.getResult()) { - ((MultiHostRegistrarImpl)registrar).addToResults(p.first, p.second); + ((MultiHostRegistrarImpl)registrar).addToResults(p.first, p.second, result); } if (data == null) { diff --git a/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerHandler.java b/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerHandler.java index 71a0c9508a8d..346ed4cf1cfd 100644 --- a/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerHandler.java @@ -37,6 +37,7 @@ import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.classMembers.ElementNeedsThis; import com.intellij.util.IncorrectOperationException; +import com.siyeh.ig.psiutils.FileTypeUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -102,7 +103,7 @@ public class AnonymousToInnerHandler implements RefactoringActionHandler { return; } PsiElement targetContainer = findTargetContainer(myAnonClass); - if (JspPsiUtil.isInJspFile(targetContainer) && targetContainer instanceof PsiFile) { + if (FileTypeUtils.isInServerPageFile(targetContainer) && targetContainer instanceof PsiFile) { String message = RefactoringBundle.message("error.not.supported.for.jsp", REFACTORING_NAME); showErrorMessage(editor, message); return; @@ -208,7 +209,7 @@ public class AnonymousToInnerHandler implements RefactoringActionHandler { if (element instanceof PsiNewExpression) { final PsiNewExpression newExpression = (PsiNewExpression)element; if (newExpression.getAnonymousClass() != null) { - return newExpression.getAnonymousClass(); + return newExpression.getAnonymousClass(); } } element = element.getParent(); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java index d186ef9f0ae9..1aac71dfd7ee 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java @@ -67,6 +67,7 @@ import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.occurrences.OccurrenceManager; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; +import com.siyeh.ig.psiutils.FileTypeUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -158,7 +159,7 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase final Project project, PsiType tempType) { if (myParentClass == null) { - if (JspPsiUtil.isInJspFile(file)) { + if (FileTypeUtils.isInServerPageFile(file)) { CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle.message("error.not.supported.for.jsp", getRefactoringName()), getRefactoringName(), getHelpID()); return true; diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java index 1f9661d1c5e0..08a6bf64234f 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java @@ -38,6 +38,7 @@ import com.intellij.refactoring.util.EnumConstantsUtil; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; +import com.siyeh.ig.psiutils.FileTypeUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -69,7 +70,7 @@ public abstract class LocalToFieldHandler { if (parent instanceof PsiClass && !(myIsConstant && parent instanceof PsiAnonymousClass)) { classes.add((PsiClass)parent); } - if (parent instanceof PsiFile && JspPsiUtil.isInJspFile(parent)) { + if (parent instanceof PsiFile && FileTypeUtils.isInServerPageFile(parent)) { String message = RefactoringBundle.message("error.not.supported.for.jsp", REFACTORING_NAME); CommonRefactoringUtil.showErrorHint(myProject, editor, message, REFACTORING_NAME, HelpID.LOCAL_TO_FIELD); return false; diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveDirectoryWithClassesHelper.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveDirectoryWithClassesHelper.java index 7e3838ac891d..930eafc5cf6b 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveDirectoryWithClassesHelper.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveDirectoryWithClassesHelper.java @@ -10,6 +10,7 @@ import com.intellij.refactoring.util.RefactoringConflictsUtil; import com.intellij.usageView.UsageInfo; import com.intellij.util.Function; import com.intellij.util.containers.MultiMap; +import com.siyeh.ig.psiutils.FileTypeUtils; import java.util.*; @@ -76,8 +77,8 @@ public class JavaMoveDirectoryWithClassesHelper extends MoveDirectoryWithClasses if (!(file instanceof PsiClassOwner)) { return false; } - - if (!JspPsiUtil.isInJspFile(file)) { + + if (!FileTypeUtils.isInServerPageFile(file)) { return false; } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesUtil.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesUtil.java index 298248347878..5f3471f63ab8 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesUtil.java @@ -38,6 +38,7 @@ import com.intellij.refactoring.util.TextOccurrencesUtil; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; +import com.siyeh.ig.psiutils.FileTypeUtils; import org.jetbrains.annotations.Nullable; import java.io.File; @@ -231,7 +232,7 @@ public class MoveClassesOrPackagesUtil { if (!moveDestination.equals(file.getContainingDirectory())) { LOG.assertTrue(file.getVirtualFile() != null, aClass); MoveFilesOrDirectoriesUtil.doMoveFile(file, moveDestination); - if (file instanceof PsiClassOwner && newPackage != null && !JspPsiUtil.isInJspFile(file)) { + if (file instanceof PsiClassOwner && newPackage != null && !FileTypeUtils.isInServerPageFile(file)) { // Do not rely on class instance identity retention after setPackageName (Scala) String aClassName = aClass.getName(); ((PsiClassOwner)file).setPackageName(newPackage.getQualifiedName()); @@ -304,7 +305,7 @@ public class MoveClassesOrPackagesUtil { } return directory; } - + public static VirtualFile chooseSourceRoot(final PackageWrapper targetPackage, final VirtualFile[] contentSourceRoots, final PsiDirectory initialDirectory) { diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveJavaFileHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveJavaFileHandler.java index de994d90819c..3134f39ecf18 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveJavaFileHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveJavaFileHandler.java @@ -29,6 +29,7 @@ import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler; import com.intellij.refactoring.util.MoveRenameUsageInfo; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.siyeh.ig.psiutils.FileTypeUtils; import java.util.ArrayList; import java.util.Collections; @@ -41,7 +42,7 @@ public class MoveJavaFileHandler extends MoveFileHandler { @Override public boolean canProcessElement(PsiFile element) { return element instanceof PsiJavaFile && - !JspPsiUtil.isInJspFile(element) && + !FileTypeUtils.isInServerPageFile(element) && !ProjectRootsUtil.isOutsideSourceRoot(element) && !(element instanceof PsiCompiledElement); } diff --git a/java/java-impl/src/com/intellij/refactoring/rename/JavaVetoRenameCondition.java b/java/java-impl/src/com/intellij/refactoring/rename/JavaVetoRenameCondition.java index 40ad2552001f..72231dc2f50c 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/JavaVetoRenameCondition.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/JavaVetoRenameCondition.java @@ -20,12 +20,13 @@ import com.intellij.openapi.util.Condition; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiJavaFile; -import com.intellij.psi.JspPsiUtil; +import com.siyeh.ig.psiutils.FileTypeUtils; public class JavaVetoRenameCondition implements Condition<PsiElement> { + @Override public boolean value(final PsiElement element) { return element instanceof PsiJavaFile && - !JspPsiUtil.isInJspFile(element) && + !FileTypeUtils.isInServerPageFile(element) && !ProjectRootsUtil.isOutsideSourceRoot((PsiFile)element) && ((PsiJavaFile) element).getClasses().length > 0; } diff --git a/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java b/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java index 7f139233f5f4..0dfd7488c21b 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java @@ -24,6 +24,8 @@ import com.intellij.lang.findUsages.DescriptiveNameUtil; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.FileContextUtil; import com.intellij.psi.search.searches.ClassInheritorsSearch; +import com.intellij.psi.util.MethodSignature; +import com.intellij.psi.util.MethodSignatureUtil; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.RefactoringBundle; @@ -59,9 +61,19 @@ public class ConflictsUtil { final PsiMethod prototype, final MultiMap<PsiElement,String> conflicts) { if (prototype == null) return; - final String protoMethodInfo = getMethodPrototypeString(prototype); + String protoMethodInfo = getMethodPrototypeString(prototype); PsiMethod method = aClass != null ? aClass.findMethodBySignature(prototype, true) : null; + if (method == null && aClass != null) { + final MethodSignature signature = prototype.getSignature(PsiSubstitutor.EMPTY); + for (PsiMethod classMethod : aClass.getMethods()) { + if (MethodSignatureUtil.areSignaturesErasureEqual(signature, classMethod.getSignature(PsiSubstitutor.EMPTY))) { + method = classMethod; + protoMethodInfo = "with same erasure"; + break; + } + } + } if (method != null && method != refactoredMethod) { if (aClass.equals(method.getContainingClass())) { @@ -69,7 +81,7 @@ public class ConflictsUtil { RefactoringBundle.message("current.class") : RefactoringUIUtil.getDescription(aClass, false); conflicts.putValue(method, RefactoringBundle.message("method.0.is.already.defined.in.the.1", - getMethodPrototypeString(prototype), + protoMethodInfo, classDescr)); } else { // method somewhere in base class diff --git a/java/java-impl/src/com/intellij/usages/impl/rules/ClassGroupingRule.java b/java/java-impl/src/com/intellij/usages/impl/rules/ClassGroupingRule.java index 8cd847129573..b4f6127110f0 100644 --- a/java/java-impl/src/com/intellij/usages/impl/rules/ClassGroupingRule.java +++ b/java/java-impl/src/com/intellij/usages/impl/rules/ClassGroupingRule.java @@ -33,6 +33,7 @@ import com.intellij.usages.UsageGroup; import com.intellij.usages.UsageView; import com.intellij.usages.rules.PsiElementUsage; import com.intellij.usages.rules.UsageGroupingRule; +import com.siyeh.ig.psiutils.FileTypeUtils; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -79,7 +80,7 @@ public class ClassGroupingRule implements UsageGroupingRule { } else { // skip JspClass synthetic classes. - if (containingClass.getParent() instanceof PsiFile && JspPsiUtil.isInJspFile(containingClass)) { + if (containingClass.getParent() instanceof PsiFile && FileTypeUtils.isInServerPageFile(containingClass)) { containingClass = null; } } diff --git a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java index ff3543a37f16..c09660c4af08 100644 --- a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java @@ -239,7 +239,16 @@ public class GenericsUtil { supers.add(classToAdd); } - public static boolean isTypeArgumentsApplicable(PsiTypeParameter[] typeParams, PsiSubstitutor substitutor, final PsiElement context) { + public static boolean isTypeArgumentsApplicable(final PsiTypeParameter[] typeParams, + final PsiSubstitutor substitutor, + final PsiElement context) { + return isTypeArgumentsApplicable(typeParams, substitutor, context, true); + } + + public static boolean isTypeArgumentsApplicable(final PsiTypeParameter[] typeParams, + final PsiSubstitutor substitutor, + final PsiElement context, + final boolean allowUncheckedConversion) { nextTypeParam: for (PsiTypeParameter typeParameter : typeParams) { PsiType substituted = substitutor.substitute(typeParameter); @@ -249,16 +258,49 @@ public class GenericsUtil { PsiClassType[] extendsTypes = typeParameter.getExtendsListTypes(); for (PsiClassType type : extendsTypes) { PsiType extendsType = substitutor.substitute(type); - if (extendsType.isAssignableFrom(substituted)) { - continue nextTypeParam; + if (substituted instanceof PsiWildcardType) { + if (((PsiWildcardType)substituted).isSuper()) { + continue; + } + final PsiType extendsBound = ((PsiWildcardType)substituted).getExtendsBound(); + if (TypeConversionUtil.erasure(extendsType).equals(TypeConversionUtil.erasure(extendsBound))) { + if (extendsBound instanceof PsiClassType) { + if (acceptExtendsBound((PsiClassType)extendsBound, 0)) continue; + } else if (extendsBound instanceof PsiIntersectionType) { + for (PsiType psiType : ((PsiIntersectionType)extendsBound).getConjuncts()) { + if (psiType instanceof PsiClassType) { + if (acceptExtendsBound((PsiClassType)psiType, 0)) continue nextTypeParam; + } + } + } + } + } + if (!TypeConversionUtil.isAssignable(extendsType, substituted, allowUncheckedConversion)) { + return false; } } - if (extendsTypes.length > 0) return false; } - return true; } + private static boolean acceptExtendsBound(PsiClassType extendsBound, int depth) { + PsiType[] parameters = extendsBound.getParameters(); + if (parameters.length == 1) { + PsiType argType = parameters[0]; + if (argType instanceof PsiCapturedWildcardType && depth == 0) { + argType = ((PsiCapturedWildcardType)argType).getWildcard(); + } + if (argType instanceof PsiWildcardType) { + if (!((PsiWildcardType)argType).isBounded()) return true; + final PsiType bound = ((PsiWildcardType)argType).getExtendsBound(); + if (bound instanceof PsiClassType && TypeConversionUtil.erasure(bound).equals(TypeConversionUtil.erasure(extendsBound))) { + return acceptExtendsBound((PsiClassType)bound, depth + 1); + } + } + } + return false; + } + public static boolean isFromExternalTypeLanguage(@NotNull PsiType type) { String internalCanonicalText = type.getInternalCanonicalText(); return internalCanonicalText != null && internalCanonicalText.equals(type.getCanonicalText()); diff --git a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java index 94f4cd30ffd0..299575ef5632 100644 --- a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java +++ b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java @@ -94,6 +94,10 @@ public class MethodCandidateInfo extends CandidateInfo{ return myApplicabilityLevel; } + public PsiSubstitutor getSiteSubstitutor() { + return super.getSubstitutor(); + } + @Override public PsiSubstitutor getSubstitutor() { if (myCalcedSubstitutor == null) { diff --git a/java/openapi/src/com/intellij/psi/util/EnclosingLoopMatcherExpression.java b/java/java-psi-api/src/com/intellij/psi/util/EnclosingLoopMatcherExpression.java index 4a370cd914b3..4a370cd914b3 100644 --- a/java/openapi/src/com/intellij/psi/util/EnclosingLoopMatcherExpression.java +++ b/java/java-psi-api/src/com/intellij/psi/util/EnclosingLoopMatcherExpression.java diff --git a/java/openapi/src/com/intellij/psi/util/EnclosingLoopOrSwitchMatcherExpression.java b/java/java-psi-api/src/com/intellij/psi/util/EnclosingLoopOrSwitchMatcherExpression.java index b40ce6882bb1..b40ce6882bb1 100644 --- a/java/openapi/src/com/intellij/psi/util/EnclosingLoopOrSwitchMatcherExpression.java +++ b/java/java-psi-api/src/com/intellij/psi/util/EnclosingLoopOrSwitchMatcherExpression.java diff --git a/java/openapi/src/com/intellij/psi/util/JavaMatchers.java b/java/java-psi-api/src/com/intellij/psi/util/JavaMatchers.java index 4378141bfc5d..4378141bfc5d 100644 --- a/java/openapi/src/com/intellij/psi/util/JavaMatchers.java +++ b/java/java-psi-api/src/com/intellij/psi/util/JavaMatchers.java diff --git a/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java b/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java index 077dc8019fa3..b514fa2349c4 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java @@ -58,7 +58,7 @@ public class MethodSignatureUtil { } }; - private static boolean areErasedParametersEqual(@NotNull MethodSignature method1, @NotNull MethodSignature method2) { + public static boolean areErasedParametersEqual(@NotNull MethodSignature method1, @NotNull MethodSignature method2) { PsiType[] erased1 = method1 instanceof MethodSignatureBase ? ((MethodSignatureBase)method1).getErasedParameterTypes() : calcErasedParameterTypes(method1); PsiType[] erased2 = method2 instanceof MethodSignatureBase diff --git a/java/openapi/src/com/intellij/psi/util/PropertyMemberType.java b/java/java-psi-api/src/com/intellij/psi/util/PropertyMemberType.java index 90bdec5caf44..90bdec5caf44 100644 --- a/java/openapi/src/com/intellij/psi/util/PropertyMemberType.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PropertyMemberType.java diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java index 020881b61a9a..642d8559e712 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java @@ -466,8 +466,20 @@ public final class PsiUtil extends PsiUtilCore { } @MethodCandidateInfo.ApplicabilityLevelConstant - public static int getApplicabilityLevel(@NotNull final PsiMethod method, @NotNull final PsiSubstitutor substitutorForMethod, @NotNull final PsiType[] args, - @NotNull final LanguageLevel languageLevel) { + public static int getApplicabilityLevel(@NotNull final PsiMethod method, + @NotNull final PsiSubstitutor substitutorForMethod, + @NotNull final PsiType[] args, + @NotNull final LanguageLevel languageLevel) { + return getApplicabilityLevel(method, substitutorForMethod, args, languageLevel, true, true); + } + + @MethodCandidateInfo.ApplicabilityLevelConstant + public static int getApplicabilityLevel(@NotNull final PsiMethod method, + @NotNull final PsiSubstitutor substitutorForMethod, + @NotNull final PsiType[] args, + @NotNull final LanguageLevel languageLevel, + final boolean allowUncheckedConversion, + final boolean checkVarargs) { final PsiParameter[] parms = method.getParameterList().getParameters(); if (args.length < parms.length - 1) return ApplicabilityLevel.NOT_APPLICABLE; @@ -479,7 +491,7 @@ public final class PsiUtil extends PsiUtilCore { PsiType parmType = getParameterType(parms[parms.length - 1], languageLevel, substitutorForMethod); PsiType argType = args[args.length - 1]; if (argType == null) return ApplicabilityLevel.NOT_APPLICABLE; - if (TypeConversionUtil.isAssignable(parmType, argType)) return ApplicabilityLevel.FIXED_ARITY; + if (TypeConversionUtil.isAssignable(parmType, argType, allowUncheckedConversion)) return ApplicabilityLevel.FIXED_ARITY; if (isRaw) { final PsiType erasedParamType = TypeConversionUtil.erasure(parmType); @@ -491,7 +503,7 @@ public final class PsiUtil extends PsiUtilCore { } } - if (method.isVarArgs() && languageLevel.compareTo(LanguageLevel.JDK_1_5) >= 0) { + if (checkVarargs && method.isVarArgs() && languageLevel.compareTo(LanguageLevel.JDK_1_5) >= 0) { if (args.length < parms.length) return ApplicabilityLevel.VARARGS; PsiParameter lastParameter = parms[parms.length - 1]; if (!lastParameter.isVarArgs()) return ApplicabilityLevel.NOT_APPLICABLE; diff --git a/java/java-impl/src/com/intellij/codeInsight/JavaContainerProvider.java b/java/java-psi-impl/src/com/intellij/codeInsight/JavaContainerProvider.java index 64a715e3a616..64a715e3a616 100644 --- a/java/java-impl/src/com/intellij/codeInsight/JavaContainerProvider.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/JavaContainerProvider.java diff --git a/java/java-impl/src/com/intellij/codeInsight/highlighting/JavaHighlightUsagesDescriptionProvider.java b/java/java-psi-impl/src/com/intellij/codeInsight/highlighting/JavaHighlightUsagesDescriptionProvider.java index b09181c1a5da..b09181c1a5da 100644 --- a/java/java-impl/src/com/intellij/codeInsight/highlighting/JavaHighlightUsagesDescriptionProvider.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/highlighting/JavaHighlightUsagesDescriptionProvider.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java index d24bfd9ff654..6dde4206470f 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java @@ -526,6 +526,44 @@ public class PsiResolveHelperImpl implements PsiResolveHelper { substitutor = substitutor.put(typeParameter, substitution); } } + for (int i = 0; i < typeParameters.length; i++) { + PsiTypeParameter typeParameter = typeParameters[i]; + if (!substitutor.getSubstitutionMap().containsKey(typeParameter)) { + PsiType substitutionFromBounds = PsiType.NULL; + OtherParameters: + for (int j = 0; j < typeParameters.length; j++) { + if (i != j) { + PsiTypeParameter other = typeParameters[j]; + final PsiType otherSubstitution = substitutor.substitute(other); + if (otherSubstitution == null) continue; + final PsiClassType[] bounds = other.getExtendsListTypes(); + for (PsiClassType bound : bounds) { + final PsiType substitutedBound = substitutor.substitute(bound); + final Pair<PsiType, ConstraintType> currentConstraint = + getSubstitutionForTypeParameterConstraint(typeParameter, substitutedBound, otherSubstitution, true, languageLevel); + if (currentConstraint == null) continue; + final PsiType currentSubstitution = currentConstraint.getFirst(); + final ConstraintType currentConstraintType = currentConstraint.getSecond(); + if (currentConstraintType == ConstraintType.EQUALS) { + substitutionFromBounds = currentSubstitution; + break OtherParameters; + } + else if (currentConstraintType == ConstraintType.SUPERTYPE) { + if (PsiType.NULL.equals(substitutionFromBounds)) { + substitutionFromBounds = currentSubstitution; + } + else { + substitutionFromBounds = GenericsUtil.getLeastUpperBound(substitutionFromBounds, currentSubstitution, myManager); + } + } + } + } + } + if (substitutionFromBounds != PsiType.NULL) { + substitutor = substitutor.put(typeParameter, substitutionFromBounds); + } + } + } return substitutor; } @@ -1163,15 +1201,18 @@ public class PsiResolveHelperImpl implements PsiResolveHelper { } } - PsiClassType[] superTypes = typeParameter.getSuperTypes(); + PsiType[] superTypes = typeParameter.getSuperTypes(); if (superTypes.length == 0) return null; - PsiType superType = substitutor.substitute(superTypes[0]); - if (superType instanceof PsiClassType && ((PsiClassType)superType).isRaw()) { - superType = TypeConversionUtil.erasure(superType); + for (int i = 0; i < superTypes.length; i++) { + PsiType superType = substitutor.substitute(superTypes[i]); + if (superType instanceof PsiClassType && ((PsiClassType)superType).isRaw()) { + superType = TypeConversionUtil.erasure(superType); + } + if (superType == null) superType = PsiType.getJavaLangObject(myManager, scope); + if (superType == null) return null; + superTypes[i] = superType; } - if (superType == null) superType = PsiType.getJavaLangObject(myManager, scope); - if (superType == null) return null; - return policy.getInferredTypeWithNoConstraint(myManager, superType); + return policy.getInferredTypeWithNoConstraint(myManager, PsiIntersectionType.createIntersection(superTypes)); } return null; } diff --git a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java index 4e6fa6c6cec0..0f54e4978348 100644 --- a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java +++ b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java @@ -33,9 +33,11 @@ import gnu.trove.THashMap; import gnu.trove.THashSet; import gnu.trove.TIntArrayList; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * Created by IntelliJ IDEA. @@ -71,7 +73,7 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ boolean atLeastOneMatch = checkParametersNumber(conflicts, myActualParameterTypes.length, true); if (conflicts.size() == 1) return conflicts.get(0); - checkSameSignatures(conflicts, myLanguageLevel); + checkSameSignatures(conflicts); if (conflicts.size() == 1) return conflicts.get(0); checkAccessStaticLevels(conflicts, true); @@ -193,7 +195,7 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ } } - private void checkSameSignatures(@NotNull List<CandidateInfo> conflicts, @NotNull LanguageLevel languageLevel) { + private void checkSameSignatures(@NotNull List<CandidateInfo> conflicts) { // candidates should go in order of class hierarchy traversal // in order for this to work Map<MethodSignature, CandidateInfo> signatures = new THashMap<MethodSignature, CandidateInfo>(conflicts.size()); @@ -307,14 +309,17 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ if (MethodSignatureUtil.areSignaturesEqual(existingMethod.getSignature(eSubstitutor), method.getSignature(cSubstitutor))) { final PsiType returnType = eSubstitutor.substitute(existingMethod.getReturnType()); final PsiType returnType1 = cSubstitutor.substitute(method.getReturnType()); - if (returnType != null && returnType1 != null && !returnType1.equals(returnType) && TypeConversionUtil.isAssignable(returnType, returnType1, false)) { - if (class1.isInterface() && !existingClass.isInterface()) continue; - conflicts.remove(existing); - } else { - conflicts.remove(i); + if (returnType != null && returnType1 != null && !returnType1.equals(returnType)) { + if (TypeConversionUtil.isAssignable(returnType, returnType1, false)) { + if (class1.isInterface() && !existingClass.isInterface()) continue; + conflicts.remove(existing); + } else { + if (!TypeConversionUtil.isAssignable(returnType1, returnType, false)) continue; + conflicts.remove(i); + } + i--; + break; } - i--; - break; } } } @@ -420,42 +425,6 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ NEITHER } - private static Specifics checkSubtyping(PsiType type1, PsiType type2, PsiMethod method1, PsiMethod method2) { - return checkSubtyping(type1, type2, method1, method2, true); - } - - @Nullable - private static Specifics checkSubtyping(PsiType type1, - PsiType type2, - PsiMethod method1, - PsiMethod method2, - boolean boxingHappening) { - boolean noBoxing = boxingHappening || type1 instanceof PsiPrimitiveType == type2 instanceof PsiPrimitiveType; - boolean allowUncheckedConversion = - !method1.hasModifierProperty(PsiModifier.STATIC) && !method2.hasModifierProperty(PsiModifier.STATIC); - - if (!allowUncheckedConversion) { - final PsiClass containingClass1 = method1.getContainingClass(); - final PsiClass containingClass2 = method2.getContainingClass(); - if (containingClass1 != null && containingClass2 != null) { - allowUncheckedConversion = !containingClass1.isInheritor(containingClass2, true) && - !containingClass2.isInheritor(containingClass1, true); - } - } - - final boolean assignable2From1 = noBoxing && TypeConversionUtil.isAssignable(type2, type1, allowUncheckedConversion); - final boolean assignable1From2 = noBoxing && TypeConversionUtil.isAssignable(type1, type2, allowUncheckedConversion); - if (assignable1From2 || assignable2From1) { - if (assignable1From2 && assignable2From1) { - return null; - } - - return assignable1From2 ? Specifics.SECOND : Specifics.FIRST; - } - - return allowUncheckedConversion ? Specifics.NEITHER : null; - } - private static boolean isBoxingHappened(PsiType argType, PsiType parameterType, @NotNull LanguageLevel languageLevel) { if (argType == null) return parameterType instanceof PsiPrimitiveType; if (parameterType instanceof PsiClassType) { @@ -485,12 +454,14 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ final int max = Math.max(params1.length, params2.length); PsiType[] types1 = new PsiType[max]; PsiType[] types2 = new PsiType[max]; + final boolean varargsPosition = applicabilityLevel == MethodCandidateInfo.ApplicabilityLevel.VARARGS; for (int i = 0; i < max; i++) { ProgressManager.checkCanceled(); PsiType type1 = params1.length > 0 ? params1[Math.min(i, params1.length - 1)].getType() : null; PsiType type2 = params2.length > 0 ? params2[Math.min(i, params2.length - 1)].getType() : null; - if (applicabilityLevel == MethodCandidateInfo.ApplicabilityLevel.VARARGS) { + if (varargsPosition) { if (type1 instanceof PsiEllipsisType && type2 instanceof PsiEllipsisType && + params1.length == params2.length && (!JavaVersionService.getInstance().isAtLeast(class1, JavaSdkVersion.JDK_1_7) || ((PsiArrayType)type1).getComponentType().equalsToText(CommonClassNames.JAVA_LANG_OBJECT) || ((PsiArrayType)type2).getComponentType().equalsToText(CommonClassNames.JAVA_LANG_OBJECT))) { type1 = ((PsiEllipsisType)type1).toArrayType(); type2 = ((PsiEllipsisType)type2).toArrayType(); @@ -505,6 +476,7 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ types2[i] = type2; } + boolean sameBoxing = true; int[] boxingHappened = new int[2]; for (int i = 0; i < types1.length; i++) { ProgressManager.checkCanceled(); @@ -512,231 +484,125 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ PsiType type2 = classSubstitutor2.substitute(types2[i]); PsiType argType = i < myActualParameterTypes.length ? myActualParameterTypes[i] : null; - boxingHappened[0] += isBoxingHappened(argType, type1, languageLevel) ? 1 : 0; - boxingHappened[1] += isBoxingHappened(argType, type2, languageLevel) ? 1 : 0; + boolean boxingInFirst = false; + if (isBoxingHappened(argType, type1, languageLevel)) { + boxingHappened[0] += 1; + boxingInFirst = true; + } + + boolean boxingInSecond = false; + if (isBoxingHappened(argType, type2, languageLevel)) { + boxingHappened[1] += 1; + boxingInSecond = true; + } + sameBoxing &= boxingInFirst == boxingInSecond; } if (boxingHappened[0] == 0 && boxingHappened[1] > 0) return Specifics.FIRST; if (boxingHappened[0] > 0 && boxingHappened[1] == 0) return Specifics.SECOND; - Specifics isMoreSpecific = null; - for (int i = 0; i < types1.length; i++) { - ProgressManager.checkCanceled(); - Specifics specifics = checkSubstitutorSpecific(method1, method2, classSubstitutor1, classSubstitutor2, types1[i], types2[i]); - if (specifics == null) { - PsiSubstitutor methodSubstitutor1 = PsiSubstitutor.EMPTY; - PsiSubstitutor methodSubstitutor2 = PsiSubstitutor.EMPTY; - if (typeParameters1.length == 0 || typeParameters2.length == 0) { - if (typeParameters1.length > 0) { - final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(myArgumentsList.getProject()).getResolveHelper(); - methodSubstitutor1 = calculateMethodSubstitutor(typeParameters1, types1, types2, resolveHelper, languageLevel); - } - else if (typeParameters2.length > 0) { - final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(myArgumentsList.getProject()).getResolveHelper(); - methodSubstitutor2 = calculateMethodSubstitutor(typeParameters2, types2, types1, resolveHelper, languageLevel); - } - } - else { - PsiElementFactory factory = JavaPsiFacade.getInstance(myArgumentsList.getProject()).getElementFactory(); - methodSubstitutor1 = factory.createRawSubstitutor(PsiSubstitutor.EMPTY, typeParameters1); - methodSubstitutor2 = factory.createRawSubstitutor(PsiSubstitutor.EMPTY, typeParameters2); + if (sameBoxing) { + final PsiSubstitutor siteSubstitutor1 = ((MethodCandidateInfo)info1).getSiteSubstitutor(); + final PsiSubstitutor siteSubstitutor2 = ((MethodCandidateInfo)info2).getSiteSubstitutor(); + + final PsiType[] types2AtSite = typesAtSite(types2, siteSubstitutor2); + final PsiType[] types1AtSite = typesAtSite(types1, siteSubstitutor1); + + final PsiSubstitutor methodSubstitutor1 = calculateMethodSubstitutor(typeParameters1, method1, siteSubstitutor1, types1, types2AtSite, languageLevel); + final PsiSubstitutor methodSubstitutor2 = calculateMethodSubstitutor(typeParameters2, method2, siteSubstitutor2, types2, types1AtSite, languageLevel); + + final boolean applicable12 = isApplicableTo(types2AtSite, method1, typeParameters1, languageLevel, methodSubstitutor1, varargsPosition); + final boolean applicable21 = isApplicableTo(types1AtSite, method2, typeParameters2, languageLevel, methodSubstitutor2, varargsPosition); + + if (applicable12 || applicable21) { + + if (applicable12 && !applicable21) return Specifics.SECOND; + if (applicable21 && !applicable12) return Specifics.FIRST; + + final boolean abstract1 = method1.hasModifierProperty(PsiModifier.ABSTRACT); + final boolean abstract2 = method2.hasModifierProperty(PsiModifier.ABSTRACT); + if (abstract1 && !abstract2) { + return Specifics.SECOND; } - PsiType type1 = classSubstitutor1.substitute(methodSubstitutor1.substitute(types1[i])); - PsiType type2 = classSubstitutor2.substitute(methodSubstitutor2.substitute(types2[i])); - specifics = type1 == null || type2 == null ? null : checkSubtyping(type1, type2, method1, method2, boxingHappened[0] == 0 || boxingHappened[1] == 0); - if (specifics == null) { - continue; + if (abstract2 && !abstract1) { + return Specifics.FIRST; } } - - switch (specifics) { - case FIRST: - if (isMoreSpecific == Specifics.SECOND) return Specifics.NEITHER; - isMoreSpecific = specifics; - break; - case SECOND: - if (isMoreSpecific == Specifics.FIRST) return Specifics.NEITHER; - isMoreSpecific = specifics; - break; - case NEITHER: - return Specifics.NEITHER; + } + else if (varargsPosition) { + final PsiType lastParamType1 = classSubstitutor1.substitute(types1[types1.length - 1]); + final PsiType lastParamType2 = classSubstitutor2.substitute(types2[types1.length - 1]); + final boolean assignable1 = TypeConversionUtil.isAssignable(lastParamType2, lastParamType1); + final boolean assignable2 = TypeConversionUtil.isAssignable(lastParamType1, lastParamType2); + if (assignable1 && !assignable2) { + return Specifics.FIRST; + } + if (assignable2 && !assignable1) { + return Specifics.SECOND; } } - if (isMoreSpecific == null && class1 != class2) { + if (class1 != class2) { if (class2.isInheritor(class1, true) || class1.isInterface() && !class2.isInterface()) { if (MethodSignatureUtil.isSubsignature(method1.getSignature(info1.getSubstitutor()), method2.getSignature(info2.getSubstitutor()))) { - isMoreSpecific = Specifics.SECOND; + return Specifics.SECOND; } else if (method1.hasModifierProperty(PsiModifier.STATIC) && method2.hasModifierProperty(PsiModifier.STATIC) && boxingHappened[0] == 0) { - isMoreSpecific = Specifics.SECOND; + return Specifics.SECOND; } } else if (class1.isInheritor(class2, true) || class2.isInterface()) { - if (MethodSignatureUtil.isSubsignature(method2.getSignature(info2.getSubstitutor()), method1.getSignature(info1.getSubstitutor()))) { - isMoreSpecific = Specifics.FIRST; + if (MethodSignatureUtil.areErasedParametersEqual(method1.getSignature(PsiSubstitutor.EMPTY), method2.getSignature(PsiSubstitutor.EMPTY)) && + MethodSignatureUtil.isSubsignature(method2.getSignature(info2.getSubstitutor()), method1.getSignature(info1.getSubstitutor()))) { + return Specifics.FIRST; } else if (method1.hasModifierProperty(PsiModifier.STATIC) && method2.hasModifierProperty(PsiModifier.STATIC) && boxingHappened[0] == 0) { - isMoreSpecific = Specifics.FIRST; + return Specifics.FIRST; } } } - if (isMoreSpecific == null) { - if (!JavaVersionService.getInstance().isAtLeast(myArgumentsList, JavaSdkVersion.JDK_1_7) || - !MethodSignatureUtil.areParametersErasureEqual(method1, method2) || - InheritanceUtil.isInheritorOrSelf(class1, class2, true) || - InheritanceUtil.isInheritorOrSelf(class2, class1, true)) { - if (typeParameters1.length < typeParameters2.length) return Specifics.FIRST; - if (typeParameters1.length > typeParameters2.length) return Specifics.SECOND; - } - return Specifics.NEITHER; - } - return isMoreSpecific; - } - - @Nullable - private static Specifics checkSubstitutorSpecific(PsiMethod method1, - PsiMethod method2, - PsiSubstitutor classSubstitutor1, - PsiSubstitutor classSubstitutor2, - PsiType type1, - PsiType type2) { - final PsiClass aClass1 = PsiUtil.resolveClassInType(type1); - final PsiClass aClass2 = PsiUtil.resolveClassInType(type2); - if (aClass1 instanceof PsiTypeParameter && aClass2 instanceof PsiTypeParameter) { - return checkTypeParams(method1, method2, classSubstitutor1, classSubstitutor2, type1, type2, (PsiTypeParameter)aClass1, (PsiTypeParameter)aClass2); - } - if (aClass1 instanceof PsiTypeParameter && aClass2 != null) { - return chooseHigherDimension(type1, type2); - } - else if (aClass2 instanceof PsiTypeParameter && aClass1 != null) { - return chooseHigherDimension(type2, type1); - } - - final Map<PsiTypeParameter, PsiType> map1 = classSubstitutor1.getSubstitutionMap(); - final Map<PsiTypeParameter, PsiType> map2 = classSubstitutor2.getSubstitutionMap(); - if (map1.size() == 1 && map2.size() == 1) { - boolean leftAssignable = InheritanceUtil.isInheritorOrSelf(aClass2, aClass1, true); - boolean rightAssignable = InheritanceUtil.isInheritorOrSelf(aClass1, aClass2, true); - final PsiType t1 = map1.values().iterator().next(); - final PsiType t2 = map2.values().iterator().next(); - - boolean raw1 = t1 instanceof PsiClassType && ((PsiClassType)t1).hasParameters(); - boolean raw2 = t2 instanceof PsiClassType && ((PsiClassType)t2).hasParameters(); - if (!raw1 && raw2) return leftAssignable ? Specifics.FIRST : Specifics.NEITHER; - if (raw1 && !raw2) return rightAssignable ? Specifics.SECOND : Specifics.NEITHER; - - final PsiTypeParameter p1 = map1.keySet().iterator().next(); - final PsiTypeParameter p2 = map2.keySet().iterator().next(); - Specifics specifics = checkTypeParams(method1, method2, classSubstitutor1, classSubstitutor2, type1, type2, p1, p2); - if (specifics == null) { - specifics = chooseHigherDimension(t1, t2); - } - if (specifics != null) { - if (specifics == Specifics.FIRST) { - if (leftAssignable && !rightAssignable) return Specifics.NEITHER; - } - else if (specifics == Specifics.SECOND) { - if (rightAssignable && !leftAssignable) return Specifics.NEITHER; - } - } - return specifics; + final boolean raw1 = PsiUtil.isRawSubstitutor(method1, classSubstitutor1); + final boolean raw2 = PsiUtil.isRawSubstitutor(method2, classSubstitutor2); + if (raw1 ^ raw2) { + return raw1 ? Specifics.SECOND : Specifics.FIRST; } - return null; - } - private static Specifics chooseHigherDimension(PsiType type1, PsiType type2) { - if (type1 != null && type1.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) return null; - if (type2 != null && type2.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) return null; - int d1 = type1 != null ? type1.getArrayDimensions() : 0; - int d2 = type2 != null ? type2.getArrayDimensions() : 0; - if (d1 > d2) { - return Specifics.SECOND; - } - else if (d2 > d1) { - return Specifics.FIRST; - } - return null; + return Specifics.NEITHER; } - @Nullable - private static Specifics checkTypeParams(PsiMethod method1, - PsiMethod method2, - PsiSubstitutor classSubstitutor1, - PsiSubstitutor classSubstitutor2, - PsiType type1, - PsiType type2, - PsiTypeParameter p1, - PsiTypeParameter p2) { - final Map<PsiClass, PsiClassType> resolved1 = new HashMap<PsiClass, PsiClassType>(); - for (PsiClassType referenceElement : p1.getExtendsList().getReferencedTypes()) { - ProgressManager.checkCanceled(); - final PsiClass aClass = referenceElement.resolve(); - if (aClass != null) { - resolved1.put(aClass, referenceElement); - } - } - - final Map<PsiClass, PsiClassType> resolved2 = new HashMap<PsiClass, PsiClassType>(); - for (PsiClassType referenceElement : p2.getExtendsList().getReferencedTypes()) { - ProgressManager.checkCanceled(); - final PsiClass aClass = referenceElement.resolve(); - if (aClass != null) { - resolved2.put(aClass, referenceElement); - } - } - - Specifics specifics = null; - if (resolved1.size() > resolved2.size()){ - specifics = checkExtendsList(resolved1, resolved2, Specifics.FIRST); - } else if (resolved2.size() > resolved1.size()) { - specifics = checkExtendsList(resolved2, resolved1, Specifics.SECOND); - } - if (specifics != null) return specifics; - specifics = checkSubtyping(TypeConversionUtil.erasure(PsiSubstitutor.EMPTY.substitute(p1)), - TypeConversionUtil.erasure(PsiSubstitutor.EMPTY.substitute(p2)), method1, method2); - if (specifics != null) { - return specifics; - } else { - final PsiType ctype1 = classSubstitutor1.substitute(type1); - final PsiType ctype2 = classSubstitutor2.substitute(type2); - return checkSubtyping(ctype1, ctype2, method1, method2); + private boolean isApplicableTo(PsiType[] argTypes, + PsiMethod method, + PsiTypeParameter[] typeParameters, + LanguageLevel languageLevel, PsiSubstitutor methodSubstitutor, boolean checkVarargs) { + final int applicabilityLevel = PsiUtil.getApplicabilityLevel(method, methodSubstitutor, argTypes, languageLevel, false, checkVarargs); + final boolean applicable = applicabilityLevel > MethodCandidateInfo.ApplicabilityLevel.NOT_APPLICABLE; + if (applicable && !GenericsUtil.isTypeArgumentsApplicable(typeParameters, methodSubstitutor, myArgumentsList, false)) { + return false; } + return applicable; } - private static Specifics checkExtendsList(Map<PsiClass, PsiClassType> resolved1, - Map<PsiClass, PsiClassType> resolved2, - Specifics preferred) { - if (resolved1.keySet().containsAll(resolved2.keySet())){ - resolved1.keySet().removeAll(resolved2.keySet()); - for (Iterator<PsiClass> iterator = resolved1.keySet().iterator(); iterator.hasNext(); ) { - PsiClass psiClass = iterator.next(); - final PsiClassType baseType = resolved1.get(psiClass); - for (PsiClassType childType : resolved2.values()) { - ProgressManager.checkCanceled(); - if (TypeConversionUtil.isAssignable(baseType, childType, false)) { - iterator.remove(); - break; - } - } - } - if (!resolved1.isEmpty()) return preferred; - return Specifics.NEITHER; + private static PsiType[] typesAtSite(PsiType[] types1, PsiSubstitutor siteSubstitutor1) { + final PsiType[] types = new PsiType[types1.length]; + for (int i = 0; i < types1.length; i++) { + types[i] = siteSubstitutor1.substitute(types1[i]); } - return null; + return types; } private static PsiSubstitutor calculateMethodSubstitutor(final PsiTypeParameter[] typeParameters, + final PsiMethod method, + final PsiSubstitutor siteSubstitutor, final PsiType[] types1, final PsiType[] types2, - final PsiResolveHelper resolveHelper, @NotNull LanguageLevel languageLevel) { - PsiSubstitutor substitutor = resolveHelper.inferTypeArguments(typeParameters, types1, types2, languageLevel); - for (PsiTypeParameter typeParameter : typeParameters) { + PsiSubstitutor substitutor = PsiResolveHelper.SERVICE.getInstance(method.getProject()) + .inferTypeArguments(typeParameters, types1, types2, languageLevel); + for (PsiTypeParameter typeParameter : PsiUtil.typeParametersIterable(method)) { ProgressManager.checkCanceled(); LOG.assertTrue(typeParameter != null); if (!substitutor.getSubstitutionMap().containsKey(typeParameter)) { - substitutor = substitutor.put(typeParameter, TypeConversionUtil.typeParameterErasure(typeParameter)); + substitutor = substitutor.put(typeParameter, siteSubstitutor.substitute(typeParameter)); } } return substitutor; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/AmbiguousMethodCallIDEA67668.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/AmbiguousMethodCallIDEA67668.java index 2de2b0e4f5d9..b93cc27d7cda 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/AmbiguousMethodCallIDEA67668.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/AmbiguousMethodCallIDEA67668.java @@ -12,6 +12,6 @@ class B { public static void main(String[] args) { A a = null; - a.foo<error descr="Ambiguous method call: both 'A.foo(Collection<?>)' and 'A.foo(List<?>)' match">(null)</error>; + a.foo<error descr="Ambiguous method call: both 'A.foo(List<?>)' and 'A.foo(List<?>)' match">(null)</error>; } }
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA57569/pck/AmbiguousMethodCall.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA57569/pck/AmbiguousMethodCall.java new file mode 100644 index 000000000000..ac6a0cea0ead --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA57569/pck/AmbiguousMethodCall.java @@ -0,0 +1,11 @@ +package pck; +abstract class C<T> { + abstract Object foo(T x); + String foo(String x) { return null; } +} + +class D extends C<String>{ + { + foo(""); + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA57633/pck/AmbiguousMethodCall.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA57633/pck/AmbiguousMethodCall.java new file mode 100644 index 000000000000..6bd05e0b04b4 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA57633/pck/AmbiguousMethodCall.java @@ -0,0 +1,12 @@ +package pck; + +import java.io.Serializable; + +abstract class A { + abstract <T extends Comparable<?> & Serializable> void foo(T x, Integer y); + abstract <T extends Serializable & Comparable<?>> void foo(T x, Object y); + + { + foo("", 1); + } +}
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA67519/pck/AmbiguousMethodCall.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA67519/pck/AmbiguousMethodCall.java new file mode 100644 index 000000000000..f663da263e6b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA67519/pck/AmbiguousMethodCall.java @@ -0,0 +1,18 @@ +package pck; +class A<T extends C<String> & D> +{ + void bar(T x) + { + x.foo<error descr="Ambiguous method call: both 'C.foo(String)' and 'D.foo(String)' match">("")</error>; + } +} + +interface D +{ + abstract void foo(String s); +} + +interface C<T> +{ + abstract void foo(T s); +}
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA67576/pck/AmbiguousMethodCall.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA67576/pck/AmbiguousMethodCall.java new file mode 100644 index 000000000000..82706d33bc48 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA67576/pck/AmbiguousMethodCall.java @@ -0,0 +1,21 @@ +package pck; + +interface A<T> +{ + <S> T foo(); +} + +interface B +{ + <S> Object foo(); +} + +interface C extends A, B { } + +class D +{ + void bar(C x) + { + x.foo(); + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA67836/pck/AmbiguousMethodCall.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA67836/pck/AmbiguousMethodCall.java new file mode 100644 index 000000000000..b42af5ac0642 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA67836/pck/AmbiguousMethodCall.java @@ -0,0 +1,19 @@ +package pck; +import static pck.D.foo; +import static pck.C.foo; + +public class C { + public static <T> String foo(Comparable<? extends Comparable<T>> x){ + return null; + } +} + +class D { + public static <T> void foo(Comparable<? extends T> x){} +} + +class B{ + public static void bar(){ + foo(1).toLowerCase(); + } +}
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA67864/pck/AmbiguousMethodCall.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA67864/pck/AmbiguousMethodCall.java new file mode 100644 index 000000000000..8240e7aa22b0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousIDEA67864/pck/AmbiguousMethodCall.java @@ -0,0 +1,26 @@ +package pck; + +import java.util.List; + +import static pck.C.foo; +import static pck.C.foo1; +import static pck.D.foo; +import static pck.D.foo1; + +class C { + static <T> void foo(List<T> x) { } + static <T extends List> void foo1(List<T> x) { } +} + +class D { + static <T extends List<S>, S> String foo(List<T> x) { return null; } + static <T extends List<?>, S> String foo1(List<T> x) { return null; } +} + +public class Main { + public static void main(String[] args){ + List<List<String>> x = null; + foo(x).toCharArray(); + foo1(x).toCharArray(); + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousVarargs/pck/AmbiguousMethodCall.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousVarargs/pck/AmbiguousMethodCall.java index d1b120225a79..b4ce3a472bd5 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousVarargs/pck/AmbiguousMethodCall.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousVarargs/pck/AmbiguousMethodCall.java @@ -19,7 +19,7 @@ abstract class A { abstract void foo(int... x); { - foo<error descr="Ambiguous method call: both 'A.foo(Object...)' and 'A.foo(int...)' match">(1)</error>; + foo(1); } } abstract class A1 { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/AmbiguousTypeParamVsConcrete.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/AmbiguousTypeParamVsConcrete.java new file mode 100644 index 000000000000..272fb292d2a3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/AmbiguousTypeParamVsConcrete.java @@ -0,0 +1,22 @@ +public class CssPropertyValueImpl extends CssTableValueBase<CssPropertyValue, Object> implements CssPropertyValue { + public CssPropertyValueImpl(final Type type) { + super(type); + } +} + +public abstract class CssTableValueBase<V extends CssTableValue, T> implements CssTableValue<V, T> { + + protected CssTableValueBase(final Type type) { + } + + protected CssTableValueBase(final T value) { + } +} + +enum Type {} + +interface CssTableValue<A, B> { +} + +interface CssPropertyValue extends CssTableValue<CssPropertyValue, Object> { +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/BoxingSpecific.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/BoxingSpecific.java new file mode 100644 index 000000000000..382f4e7d099b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/BoxingSpecific.java @@ -0,0 +1,7 @@ +import java.util.*; + +abstract class A { + void computeCostIfNeeded(Map<Object, Integer> costMap) { + Math.min(costMap.get(null), 1); + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA67843.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA67843.java new file mode 100644 index 000000000000..69b359fae7d0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA67843.java @@ -0,0 +1,10 @@ +import java.util.List; + +class B{ + public static void bar(){ + <error descr="Inferred type 'java.util.List<java.lang.Comparable>' for type parameter 'T' is not within its bound; should implement 'java.util.List<java.lang.Comparable<java.util.List<java.lang.Comparable>>>'">foo(null)</error>.get(0).compareTo(null); + } + static <T extends List<Comparable<T>>> T foo(T x) { + return x; + } +}
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Varargs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Varargs.java index 24a51a2d0cc9..66f4e0701b4b 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Varargs.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Varargs.java @@ -22,7 +22,7 @@ class MyTest1 { I i2 = MyTest1 :: m2; i2.m(42,42); - <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest1.I'">I i3 = MyTest1 :: m3;</error> + I i3 = MyTest1 :: m3; } } diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileTwinDependencies.log b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTwinDependencies.log index 1c40adc4f7fb..4badc88cf13a 100644 --- a/java/java-tests/testData/compileServer/incremental/markDirty/recompileTwinDependencies.log +++ b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTwinDependencies.log @@ -8,9 +8,3 @@ Compiling files: src/package2/A.java src/package2/C.java End of files -Cleaning output files: -out/production/RecompileTwinDependencies/com/B.class -End of files -Compiling files: -src/com/B.java -End of files diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/empty.txt b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/empty.txt diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/pack1/empty.txt b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/pack1/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/pack1/empty.txt diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/pack1/subPack/empty.txt b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/pack1/subPack/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/pack1/subPack/empty.txt diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src2/pack1/S2.java b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src2/pack1/S2.java new file mode 100644 index 000000000000..0bd2d2024dc6 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src2/pack1/S2.java @@ -0,0 +1,3 @@ +package pack1; + +public class S2{} diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/pack1/empty.txt b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/pack1/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/pack1/empty.txt diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/pack1/subPack/Foo.java b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/pack1/subPack/Foo.java new file mode 100644 index 000000000000..2f3c2eddba6f --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/pack1/subPack/Foo.java @@ -0,0 +1,2 @@ +package pack1.subPack; +public class Foo {}
\ No newline at end of file diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/target/empty.txt b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/target/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/target/empty.txt diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src2/pack1/S2.java b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src2/pack1/S2.java new file mode 100644 index 000000000000..0bd2d2024dc6 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src2/pack1/S2.java @@ -0,0 +1,3 @@ +package pack1; + +public class S2{} diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameMethodCollisionSameSignature.java b/java/java-tests/testData/refactoring/renameCollisions/RenameMethodCollisionSameSignature.java new file mode 100644 index 000000000000..28dedc70c208 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameMethodCollisionSameSignature.java @@ -0,0 +1,7 @@ +class RenameTest<T> { + void f<caret>oo(T t) { + } + + void foo1(Object t) { + } +}
\ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AdvHighlightingJdk7Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AdvHighlightingJdk7Test.java index b35c8ff68061..dcac1068a631 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AdvHighlightingJdk7Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AdvHighlightingJdk7Test.java @@ -199,7 +199,31 @@ public class AdvHighlightingJdk7Test extends DaemonAnalyzerTestCase { doTestAmbiguous(); } + public void testAmbiguousIDEA67864() throws Exception { + doTestAmbiguous(); + } + + public void testAmbiguousIDEA67836() throws Exception { + doTestAmbiguous(); + } + + public void testAmbiguousIDEA67576() throws Exception { + doTestAmbiguous(); + } + + public void testAmbiguousIDEA67519() throws Exception { + doTestAmbiguous(); + } + + public void testAmbiguousIDEA57569() throws Exception { + doTestAmbiguous(); + } + public void testAmbiguousMethodsFromSameClassAccess() throws Exception { doTestAmbiguous(); } + + public void testAmbiguousIDEA57633() throws Exception { + doTestAmbiguous(); + } } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java index efc253f27847..3fef647dbaa3 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -310,6 +310,9 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testIDEA57439() { doTest5(false); } public void testIDEA57312() { doTest5(false); } public void testIDEA67865() { doTest5(false); } + public void testBoxingSpecific() { doTest5(false); } + public void testIDEA67843() { doTest5(false); } + public void testAmbiguousTypeParamVsConcrete() { doTest5(false); } public void testJavaUtilCollections_NoVerify() throws Exception { PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule())); diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MovePackageAsDirectoryTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MovePackageAsDirectoryTest.java index 589f935ec34d..01b8604f0e0a 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/MovePackageAsDirectoryTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/MovePackageAsDirectoryTest.java @@ -22,10 +22,8 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileAdapter; import com.intellij.openapi.vfs.VirtualFileEvent; import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiPackage; +import com.intellij.psi.*; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.refactoring.move.moveClassesOrPackages.MoveDirectoryWithClassesProcessor; import com.intellij.testFramework.PsiTestUtil; import junit.framework.Assert; @@ -80,10 +78,10 @@ public class MovePackageAsDirectoryTest extends MultiFileTestCase { doTest(createAction("pack1", "target")); } + private static final String EMPTY_TXT = "empty.txt"; public void testXmlEmptyDirRefs() throws Exception { final String packageName = "pack1"; doTest(new MyPerformAction(packageName, "target"){ - private static final String EMPTY_TXT = "empty.txt"; @Override protected void preprocessSrcDir(PsiDirectory srcDirectory) { final PsiFile empty = srcDirectory.findFile(EMPTY_TXT); @@ -108,6 +106,36 @@ public class MovePackageAsDirectoryTest extends MultiFileTestCase { }); } + public void testEmptySubDirs() throws Exception { + final String packageName = "pack1"; + doTest(new MyPerformAction(packageName, "target"){ + private static final String FOO = "pack1.subPack.Foo"; + @Override + protected void preprocessSrcDir(PsiDirectory srcDirectory) { + final PsiClass empty = JavaPsiFacade.getInstance(getProject()).findClass(FOO, GlobalSearchScope.projectScope(getProject())); + assert empty != null; + ApplicationManager.getApplication().runWriteAction(new Runnable() { + public void run() { + empty.delete(); + } + }); + } + + @Override + protected void postProcessTargetDir(PsiDirectory targetDirectory) { + final PsiDirectory subdirectory = targetDirectory.findSubdirectory(packageName); + assert subdirectory != null; + final PsiDirectory emptyDir = subdirectory.findSubdirectory("subPack"); + assert emptyDir != null; + ApplicationManager.getApplication().runWriteAction(new Runnable() { + public void run() { + emptyDir.createFile(EMPTY_TXT); + } + }); + } + }); + } + private PerformAction createAction(final String packageName, final String targetPackageName) { return new MyPerformAction(packageName, targetPackageName); } diff --git a/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java b/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java index 5fe6fbe06a68..2caa921ab3fc 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java @@ -167,6 +167,17 @@ public class RenameCollisionsTest extends LightRefactoringTestCase { fail("Conflicts were not found"); } + public void testRenameMethodCollisionSameSignature() throws Exception { + try { + doTest("foo1"); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + Assert.assertEquals("Method with same erasure is already defined in the class <b><code>RenameTest</code></b>.", e.getMessage()); + return; + } + fail("Conflicts were not found"); + } + public void testRenameMethodNoCollisionWithOtherSignature() throws Exception { doTest("foo2"); } diff --git a/java/openapi/src/com/intellij/codeInsight/ContainerProvider.java b/java/openapi/src/com/intellij/codeInsight/ContainerProvider.java deleted file mode 100644 index 63f1a42aed0b..000000000000 --- a/java/openapi/src/com/intellij/codeInsight/ContainerProvider.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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.codeInsight; - -import com.intellij.openapi.extensions.ExtensionPointName; -import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * @author Max Medvedev - */ -public interface ContainerProvider { - ExtensionPointName<ContainerProvider> EP_NAME = ExtensionPointName.create("com.intellij.codeInsight.containerProvider"); - - @Nullable - PsiElement getContainer(@NotNull PsiElement item); -} |