diff --git a/.idea/modules.xml b/.idea/modules.xml
index 9e15d0263725..00d78128e8be 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -9,7 +9,8 @@
-
+
+
diff --git a/build/scripts/layouts.gant b/build/scripts/layouts.gant
index c26409ec2350..6dc01096ba64 100644
--- a/build/scripts/layouts.gant
+++ b/build/scripts/layouts.gant
@@ -364,6 +364,8 @@ public def layoutCommunityPlugins(String home) {
include(name: "**/*.jar")
exclude(name: "**/ddmlib_1.jar")
}
+
+ jar("android_rt.jar") {module("android-rt")}
}
}
}
diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant
index e0fe9f0cfa10..38597d626387 100644
--- a/build/scripts/libLicenses.gant
+++ b/build/scripts/libLicenses.gant
@@ -190,9 +190,9 @@ libraryLicense(name: "JavaHelp", version: "2.0_02", license: "included as licens
libraryLicense(name: "JCIP Annotations", libraryName: "jcip", license: "Creative Commons Attribution License", url: "http://www.jcip.net", licenseUrl: "http://creativecommons.org/licenses/by/2.5")
libraryLicense(name: "JDOM", version: "1.1 (with patches by JetBrains)", license: "modified Apache", url: "http://www.jdom.org/", licenseUrl: "http://www.jdom.org/docs/faq.html#a0030")
libraryLicense(name: "jgit-1.1.0", version: "1.1.0.201109151100", license: "EDL/BSD", url: "http://www.eclipse.org/jgit/", licenseUrl: "http://www.eclipse.org/org/documents/edl-v10.php", attachedTo: "git4idea")
-libraryLicense(name: "JGoodies Forms", libraryName: "jgoodies-forms", version: "CVS snapshot as of 5 May 2006", license: "BSD ", url: "http://www.jgoodies.com/freeware/forms/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html")
-libraryLicense(name: "JGoodies Looks", attachedTo: "platform-impl", version: "2.4.2", license: "BSD ", url: "http://www.jgoodies.com/freeware/looks/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html")
-libraryLicense(name: "JGoodies Common", attachedTo: "platform-impl", version: "1.2.1", license: "BSD ", url: "http://www.jgoodies.com/freeware/looks/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html")
+libraryLicense(name: "JGoodies Forms", libraryName: "jgoodies-forms", version: "1.1-preview 2006-05-04 11:55:37", license: "BSD ", url: "http://www.jgoodies.com/freeware/forms/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html")
+libraryLicense(name: "JGoodies Looks", libraryName: "jgoodies-looks", version: "2.4.2", license: "BSD ", url: "http://www.jgoodies.com/freeware/looks/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html")
+libraryLicense(name: "JGoodies Common", libraryName: "jgoodies-common", version: "1.2.1", license: "BSD ", url: "http://www.jgoodies.com/freeware/looks/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html")
libraryLicense(name: "JNA", libraryName: "jna", version: "3.2.4", license: "LGPL 2.1", url: "https://jna.dev.java.net/", licenseUrl: "http://www.opensource.org/licenses/lgpl-2.1.php")
libraryLicense(name: "JNA", libraryName: "jna.jar", version: "3.2.7", license: "LGPL 2.1", url: "https://jna.dev.java.net/", licenseUrl: "http://www.opensource.org/licenses/lgpl-2.1.php")
libraryLicense(name: "JSch", libraryName: "JSch", version: "0.1.44", license: "BSD", url: "http://www.jcraft.com/jsch/", licenseUrl: "http://www.jcraft.com/jsch/LICENSE.txt")
@@ -238,4 +238,5 @@ libraryLicense(name: "Kryo", libraryName: "Kryo", version: "1.04", license: "New
jetbrainsLibrary("JPS")
jetbrainsLibrary("Maven Embedder")
jetbrainsLibrary("tcServiceMessages")
-jetbrainsLibrary("optimizedFileManager.jar")
\ No newline at end of file
+jetbrainsLibrary("optimizedFileManager.jar")
+jetbrainsLibrary("RunTime")
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java
index bcde86b2c743..79a45ec2c7b1 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java
@@ -51,8 +51,10 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComboBoxWithWidePopup;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.IconLoader;
+import com.intellij.ui.CaptionPanel;
import com.intellij.ui.PopupHandler;
import com.intellij.ui.ScrollPaneFactory;
+import com.intellij.ui.border.CustomLineBorder;
import com.intellij.ui.components.panels.Wrapper;
import com.intellij.util.Alarm;
import com.sun.jdi.ObjectCollectedException;
@@ -114,6 +116,8 @@ public class FramesPanel extends UpdatableDebuggerView {
final ActionToolbar toolbar = createToolbar();
Wrapper threads = new Wrapper();
+ CustomLineBorder border = new CustomLineBorder(CaptionPanel.CNT_ACTIVE_COLOR, 0, 0, 1, 0);
+ threads.setBorder(border);
threads.add(toolbar.getComponent(), BorderLayout.EAST);
threads.add(myThreadsCombo, BorderLayout.CENTER);
add(threads, BorderLayout.NORTH);
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java
index 314e360d2442..1674be4a3b11 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java
@@ -43,10 +43,10 @@ import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
-import com.intellij.ui.AnActionButton;
-import com.intellij.ui.AnActionButtonRunnable;
-import com.intellij.ui.ListenerUtil;
-import com.intellij.ui.ToolbarDecorator;
+import com.intellij.openapi.util.SystemInfo;
+import com.intellij.ui.*;
+import com.intellij.ui.border.CustomLineBorder;
+import com.intellij.xdebugger.impl.actions.XDebuggerActions;
import javax.swing.*;
import java.awt.*;
@@ -218,13 +218,20 @@ public class MainWatchPanel extends WatchPanel implements DataProvider {
executeAction(DebuggerActions.NEW_WATCH, tree);
}
});
- // TODO[den]: add "Add to watches action"
+ // TODO[den]: add "Add to watches action" on Mac
+ if (!SystemInfo.isMac) {
+ decorator.addExtraAction(AnActionButton.fromAction(ActionManager.getInstance().getAction(XDebuggerActions.ADD_TO_WATCH)));
+ }
decorator.setRemoveAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
executeAction(DebuggerActions.REMOVE_WATCH, tree);
}
});
+ CustomLineBorder border = new CustomLineBorder(CaptionPanel.CNT_ACTIVE_COLOR,
+ SystemInfo.isMac ? 1 : 0, 0,
+ SystemInfo.isMac ? 0 : 1, 0);
+ decorator.setToolbarBorder(border);
final JPanel panel = decorator.createPanel();
panel.setBorder(null);
return panel;
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java
index 815715a494fa..94249f82e089 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java
@@ -640,9 +640,9 @@ public class PostHighlightingPass extends TextEditorHighlightingPass {
}
private static boolean isEnumValuesMethodUsed(PsiMember member, ProgressIndicator progress, GlobalUsageHelper helper) {
- final PsiClassImpl containingClass = (PsiClassImpl)member.getContainingClass();
- if (containingClass == null) return true;
- final PsiMethod valuesMethod = containingClass.getValuesMethod();
+ final PsiClass containingClass = member.getContainingClass();
+ if (containingClass == null || !(containingClass instanceof PsiClassImpl)) return true;
+ final PsiMethod valuesMethod = ((PsiClassImpl)containingClass).getValuesMethod();
if (valuesMethod == null) return true;
return isMethodReferenced(valuesMethod, progress, helper);
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java
index 1810ff8cef1b..517f21e8def5 100644
--- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java
+++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java
@@ -34,6 +34,8 @@ import gnu.trove.TIntProcedure;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.List;
+
/**
* @author ven
*/
@@ -104,7 +106,7 @@ public class AddOnDemandStaticImportAction extends PsiElementBaseIntentionAction
}
importList.add(importStaticStatement);
- PsiFile[] roots = file.getPsiRoots();
+ List roots = file.getViewProvider().getAllFiles();
for (final PsiFile root : roots) {
PsiElement copy = root.copy();
final PsiManager manager = root.getManager();
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java
index 840947dedf8e..c85b542a0d13 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java
@@ -696,7 +696,7 @@ public class ImportHelper{
PsiFile context) {
String packageName = file.getPackageName();
- final PsiElement[] roots = file.getPsiRoots();
+ final List roots = file.getViewProvider().getAllFiles();
for (PsiElement root : roots) {
addNamesToImport(names, comments, root, packageName, context);
}
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 1da1f5915186..8e6d81444213 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
@@ -153,7 +153,7 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager {
}
else {
redundants = allImports;
- final PsiElement[] roots = file.getPsiRoots();
+ final List roots = file.getViewProvider().getAllFiles();
for (PsiElement root : roots) {
root.accept(new JavaRecursiveElementWalkingVisitor() {
@Override public void visitReferenceElement(PsiJavaCodeReferenceElement reference) {
diff --git a/java/java-psi-impl/src/com/intellij/psi/ClassFileViewProviderFactory.java b/java/java-psi-impl/src/com/intellij/psi/ClassFileViewProviderFactory.java
index bb7fd8e6d9de..213468b0669f 100644
--- a/java/java-psi-impl/src/com/intellij/psi/ClassFileViewProviderFactory.java
+++ b/java/java-psi-impl/src/com/intellij/psi/ClassFileViewProviderFactory.java
@@ -23,10 +23,11 @@ import com.intellij.lang.Language;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.fileTypes.ContentBasedFileSubstitutor;
import com.intellij.openapi.vfs.VirtualFile;
+import org.jetbrains.annotations.NotNull;
public class ClassFileViewProviderFactory implements FileViewProviderFactory{
@Override
- public FileViewProvider createFileViewProvider(final VirtualFile file, final Language language, final PsiManager manager, final boolean physical) {
+ public FileViewProvider createFileViewProvider(@NotNull final VirtualFile file, final Language language, @NotNull final PsiManager manager, final boolean physical) {
// Define language for compiled file
final ContentBasedFileSubstitutor[] processors = Extensions.getExtensions(ContentBasedFileSubstitutor.EP_NAME);
for (ContentBasedFileSubstitutor processor : processors) {
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java
index 72de4e653c72..b071cc0053bc 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java
@@ -350,8 +350,13 @@ public class StubBuildingVisitor implements ClassVisitor {
final String desc,
final String signature,
final String[] exceptions) {
- if ((access & Opcodes.ACC_SYNTHETIC) != 0) return null;
- if ((access & Opcodes.ACC_BRIDGE) != 0) return null;
+ boolean isSynthetic = (access & Opcodes.ACC_SYNTHETIC) != 0;
+
+ // JLS 13.1 says: Any constructs introduced by the compiler that do not have a corresponding construct in the source code
+ // must be marked as synthetic, except for default constructors and the class initialization method.
+ // However Scala compiler erroneously generates ACC_BRIDGE instead of ACC_SYNTHETIC flag for in-trait implementation delegation. See IDEA-78649
+ if (isSynthetic) return null;
+
if (SYNTHETIC_CLINIT_METHOD.equals(name)) return null;
boolean isDeprecated = (access & Opcodes.ACC_DEPRECATED) != 0;
diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java
index bd5c08833ab1..79915cc67295 100644
--- a/java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java
+++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java
@@ -108,7 +108,7 @@ public abstract class JavaParsingTestCase extends ParsingTestCase {
myFile = createPsiFile(name, text, parser);
myFile.putUserData(PsiUtil.FILE_LANGUAGE_LEVEL_KEY, myLanguageLevel);
try {
- checkResult(name + ".txt", myFile);
+ checkResult(name, myFile);
}
catch (IOException e) {
throw new RuntimeException(e);
diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java
index de7c5fde53b0..1399c69ed651 100644
--- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java
@@ -77,11 +77,13 @@ public class IncProjectBuilder {
}
catch (ProjectBuildException e) {
final Throwable cause = e.getCause();
- if (cause instanceof PersistentEnumerator.CorruptedException || cause instanceof MappingFailedException) {
+ if (cause instanceof PersistentEnumerator.CorruptedException || cause instanceof MappingFailedException || cause instanceof IOException) {
// force rebuild
- myMessageDispatcher.processMessage(new CompilerMessage(COMPILE_SERVER_NAME, BuildMessage.Kind.INFO,
- "Internal caches are corrupted or have outdated format, forcing project rebuild: " +
- e.getMessage()));
+ myMessageDispatcher.processMessage(new CompilerMessage(
+ COMPILE_SERVER_NAME, BuildMessage.Kind.INFO,
+ "Internal caches are corrupted or have outdated format, forcing project rebuild: " +
+ e.getMessage())
+ );
flushContext(context);
context = createContext(new AllProjectScope(scope.getProject(), Collections.emptySet(), true), false, true);
runBuild(context);
diff --git a/platform/core-api/src/com/intellij/openapi/editor/event/DocumentEvent.java b/platform/core-api/src/com/intellij/openapi/editor/event/DocumentEvent.java
index 181072e30c89..10f2b7ee9126 100644
--- a/platform/core-api/src/com/intellij/openapi/editor/event/DocumentEvent.java
+++ b/platform/core-api/src/com/intellij/openapi/editor/event/DocumentEvent.java
@@ -21,22 +21,27 @@ import org.jetbrains.annotations.NotNull;
import java.util.EventObject;
public abstract class DocumentEvent extends EventObject {
- protected DocumentEvent(Document document) {
+ protected DocumentEvent(@NotNull Document document) {
super(document);
}
- @NotNull public abstract Document getDocument();
+ @NotNull
+ public abstract Document getDocument();
public abstract int getOffset();
public abstract int getOldLength();
+
public abstract int getNewLength();
+ @NotNull
public abstract CharSequence getOldFragment();
+
+ @NotNull
public abstract CharSequence getNewFragment();
public abstract long getOldTimeStamp();
-
+
public boolean isWholeTextReplaced() {
return getOffset() == 0 && getNewLength() == getDocument().getTextLength();
}
diff --git a/platform/core-api/src/com/intellij/psi/FileViewProviderFactory.java b/platform/core-api/src/com/intellij/psi/FileViewProviderFactory.java
index a59327bf1409..66e25e3f9ca7 100644
--- a/platform/core-api/src/com/intellij/psi/FileViewProviderFactory.java
+++ b/platform/core-api/src/com/intellij/psi/FileViewProviderFactory.java
@@ -18,6 +18,7 @@ package com.intellij.psi;
import com.intellij.lang.Language;
import com.intellij.openapi.vfs.VirtualFile;
+import org.jetbrains.annotations.NotNull;
/**
* Register in extension point {@code com.intellij.fileType.fileViewProviderFactory}
@@ -26,5 +27,5 @@ import com.intellij.openapi.vfs.VirtualFile;
* @author yole
*/
public interface FileViewProviderFactory {
- FileViewProvider createFileViewProvider(final VirtualFile file, final Language language, final PsiManager manager, final boolean physical);
+ FileViewProvider createFileViewProvider(@NotNull VirtualFile file, Language language, @NotNull PsiManager manager, final boolean physical);
}
\ No newline at end of file
diff --git a/platform/core-api/src/com/intellij/psi/search/LocalSearchScope.java b/platform/core-api/src/com/intellij/psi/search/LocalSearchScope.java
index 562c2b617f85..c092c70e2d10 100644
--- a/platform/core-api/src/com/intellij/psi/search/LocalSearchScope.java
+++ b/platform/core-api/src/com/intellij/psi/search/LocalSearchScope.java
@@ -66,7 +66,8 @@ public class LocalSearchScope extends SearchScope {
for (final PsiElement element : scope) {
LOG.assertTrue(element.getContainingFile() != null, element.getClass().getName());
if (element instanceof PsiFile) {
- ContainerUtil.addAll(localScope, ((PsiFile)element).getPsiRoots());
+ List files = ((PsiFile)element).getViewProvider().getAllFiles();
+ ContainerUtil.addAll(localScope, files);
}
else {
localScope.add(element);
diff --git a/platform/core-api/src/com/intellij/psi/util/PsiTreeUtil.java b/platform/core-api/src/com/intellij/psi/util/PsiTreeUtil.java
index 9aac4bf4323d..c43925dde0ff 100644
--- a/platform/core-api/src/com/intellij/psi/util/PsiTreeUtil.java
+++ b/platform/core-api/src/com/intellij/psi/util/PsiTreeUtil.java
@@ -713,7 +713,7 @@ public class PsiTreeUtil {
int offset,
@NotNull Class clazz,
boolean strictStart) {
- final PsiElement[] psiRoots = file.getPsiRoots();
+ final List psiRoots = file.getViewProvider().getAllFiles();
T result = null;
for (PsiElement root : psiRoots) {
final PsiElement elementAt = root.findElementAt(offset);
@@ -739,7 +739,7 @@ public class PsiTreeUtil {
@NotNull Class clazz,
boolean strictStart,
@NotNull Class extends PsiElement>... stopAt) {
- final PsiElement[] psiRoots = file.getPsiRoots();
+ final List psiRoots = file.getViewProvider().getAllFiles();
T result = null;
for (PsiElement root : psiRoots) {
final PsiElement elementAt = root.findElementAt(offset);
diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/PersistentRangeMarker.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/PersistentRangeMarker.java
index e09639f0aded..e1b34cc49ad7 100644
--- a/platform/core-impl/src/com/intellij/openapi/editor/impl/PersistentRangeMarker.java
+++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/PersistentRangeMarker.java
@@ -25,8 +25,8 @@ import com.intellij.util.diff.FilesTooBigForDiffException;
* is replaced.
*
* Example: consider that the user selects all text at editor (Ctrl+A), copies it to the buffer (Ctrl+C) and performs paste (Ctrl+V).
- * All document text is replaced then but in essence it's the same, hence, we may want particular range markers to be still valid.
- *
+ * All document text is replaced then but in essence it's the same, hence, we may want particular range markers to be still valid.
+ *
* @author max
*/
class PersistentRangeMarker extends RangeMarkerImpl {
@@ -69,22 +69,23 @@ class PersistentRangeMarker extends RangeMarkerImpl {
private boolean translateViaDiff(final DocumentEventImpl event) {
try {
myStartLine = event.translateLineViaDiffStrict(myStartLine);
- if (myStartLine < 0 || myStartLine >= getDocument().getLineCount()){
+ if (myStartLine < 0 || myStartLine >= getDocument().getLineCount()) {
invalidate(event);
}
- else{
+ else {
setIntervalStart(getDocument().getLineStartOffset(myStartLine) + myStartColumn);
}
myEndLine = event.translateLineViaDiffStrict(myEndLine);
- if (myEndLine < 0 || myEndLine >= getDocument().getLineCount()){
+ if (myEndLine < 0 || myEndLine >= getDocument().getLineCount()) {
invalidate(event);
}
- else{
+ else {
setIntervalEnd(getDocument().getLineStartOffset(myEndLine) + myEndColumn);
}
return true;
- } catch (FilesTooBigForDiffException e) {
+ }
+ catch (FilesTooBigForDiffException e) {
return false;
}
}
@@ -94,12 +95,12 @@ class PersistentRangeMarker extends RangeMarkerImpl {
DocumentEventImpl event = (DocumentEventImpl)e;
final boolean shouldTranslateViaDiff = PersistentRangeMarkerUtil.shouldTranslateViaDiff(event, this);
boolean wasTranslated = shouldTranslateViaDiff;
- if (shouldTranslateViaDiff){
+ if (shouldTranslateViaDiff) {
wasTranslated = translateViaDiff(event);
}
- if (! wasTranslated) {
+ if (!wasTranslated) {
super.changedUpdateImpl(e);
- if (isValid()){
+ if (isValid()) {
storeLinesAndCols(e);
}
}
diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java
index 1bd95fca7b5c..993dda9c0535 100644
--- a/platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java
+++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java
@@ -38,6 +38,8 @@ public class DocumentEventImpl extends DocumentEvent {
private final long myOldTimeStamp;
private final boolean myIsWholeDocReplaced;
private Diff.Change myChange;
+ private static final Diff.Change TOO_BIG_FILE = new Diff.Change(0, 0, 0, 0, null) {
+ };
private int myOptimizedLineShift = -1;
private boolean myOptimizedLineShiftCalculated;
@@ -45,7 +47,11 @@ public class DocumentEventImpl extends DocumentEvent {
private int myOptimizedOldLineShift = -1;
private boolean myOptimizedOldLineShiftCalculated;
- public DocumentEventImpl(Document document, int offset, CharSequence oldString, CharSequence newString, long oldTimeStamp,
+ public DocumentEventImpl(@NotNull Document document,
+ int offset,
+ CharSequence oldString,
+ CharSequence newString,
+ long oldTimeStamp,
boolean wholeTextReplaced) {
super(document);
myOffset = offset;
@@ -83,11 +89,13 @@ public class DocumentEventImpl extends DocumentEvent {
return myNewLength;
}
+ @NotNull
@Override
public CharSequence getOldFragment() {
return myOldString;
}
+ @NotNull
@Override
public CharSequence getNewFragment() {
return myNewString;
@@ -96,11 +104,11 @@ public class DocumentEventImpl extends DocumentEvent {
@Override
@NotNull
public Document getDocument() {
- return (Document) getSource();
+ return (Document)getSource();
}
public int getStartOldIndex() {
- if(isStartOldIndexCalculated) return myStartOldIndex;
+ if (isStartOldIndexCalculated) return myStartOldIndex;
isStartOldIndexCalculated = true;
myStartOldIndex = getDocument().getLineNumber(myOffset);
@@ -108,21 +116,21 @@ public class DocumentEventImpl extends DocumentEvent {
}
public boolean isOnlyOneLineChanged() {
- if(isOnlyOneLineChangedCalculated) return isOnlyOneLineChanged;
+ if (isOnlyOneLineChangedCalculated) return isOnlyOneLineChanged;
isOnlyOneLineChangedCalculated = true;
isOnlyOneLineChanged = true;
- for(int i=0; i= change.line0 + change.deleted) {
newLine += change.inserted - change.deleted;
- } else {
+ }
+ else {
int delta = Math.min(change.inserted, line - change.line0);
newLine = change.line1 + delta;
break;
@@ -172,16 +179,23 @@ public class DocumentEventImpl extends DocumentEvent {
}
public int translateLineViaDiffStrict(int line) throws FilesTooBigForDiffException {
- if (myChange == null) buildDiff();
- Diff.Change change = myChange;
+ Diff.Change change = reBuildDiffIfNeeded();
if (change == null) return line;
return Diff.translateLine(change, line);
}
- private void buildDiff() throws FilesTooBigForDiffException {
- //Diff diff = new Diff(strings1, strings2);
- //myChange = diff.diff_2(false);
- myChange = Diff.buildChanges(myOldString, myNewString);
+ private Diff.Change reBuildDiffIfNeeded() throws FilesTooBigForDiffException {
+ if (myChange == TOO_BIG_FILE) throw new FilesTooBigForDiffException(0);
+ if (myChange == null) {
+ try {
+ myChange = Diff.buildChanges(myOldString, myNewString);
+ }
+ catch (FilesTooBigForDiffException e) {
+ myChange = TOO_BIG_FILE;
+ throw e;
+ }
+ }
+ return myChange;
}
public int getOptimizedLineShift() {
diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java b/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java
index 553de3e50cb9..dd202dd57883 100644
--- a/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java
+++ b/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java
@@ -519,18 +519,17 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF
}
roots[i++] = psi;
}
- // getPsiRoots() returns languages in the same order
- //if (roots.length > 1) {
- // Arrays.sort(roots, FILE_BY_LANGUAGE_ID);
- //}
+ if (roots.length > 1) {
+ Arrays.sort(roots, FILE_BY_LANGUAGE_ID);
+ }
return roots;
}
- //private static final Comparator FILE_BY_LANGUAGE_ID = new Comparator() {
- // @Override
- // public int compare(PsiFile o1, PsiFile o2) {
- // return o1.getLanguage().getID().compareTo(o2.getLanguage().getID());
- // }
- //};
+ private static final Comparator FILE_BY_LANGUAGE_ID = new Comparator() {
+ @Override
+ public int compare(PsiFile o1, PsiFile o2) {
+ return o1.getLanguage().getID().compareTo(o2.getLanguage().getID());
+ }
+ };
@Override
public boolean isPhysical() {
diff --git a/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java b/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java
index 9d1a226294f3..8933cb6006b8 100644
--- a/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java
+++ b/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java
@@ -28,7 +28,6 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.psi.util.PsiTreeUtil;
-import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -91,7 +90,7 @@ public class ProblemsHolder {
private boolean isInPsiFile(@NotNull PsiElement element) {
PsiFile file = element.getContainingFile();
- return ArrayUtil.indexOf(myFile.getPsiRoots(), file) != -1;
+ return myFile.getViewProvider() == file.getViewProvider();
}
private void redirectProblem(@NotNull final ProblemDescriptor problem, @NotNull final PsiElement target) {
diff --git a/platform/lang-api/src/com/intellij/psi/util/PsiUtilBase.java b/platform/lang-api/src/com/intellij/psi/util/PsiUtilBase.java
index 283c09222413..56a9c1960525 100644
--- a/platform/lang-api/src/com/intellij/psi/util/PsiUtilBase.java
+++ b/platform/lang-api/src/com/intellij/psi/util/PsiUtilBase.java
@@ -42,6 +42,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
+import java.util.*;
public class PsiUtilBase extends PsiUtilCore {
@@ -51,6 +52,12 @@ public class PsiUtilBase extends PsiUtilCore {
throw new IllegalAccessError();
}
};
+ public static final Comparator LANGUAGE_COMPARATOR = new Comparator() {
+ @Override
+ public int compare(Language o1, Language o2) {
+ return o1.getID().compareTo(o2.getID());
+ }
+ };
public static int getRootIndex(PsiElement root) {
ASTNode node = root.getNode();
@@ -59,11 +66,18 @@ public class PsiUtilBase extends PsiUtilCore {
}
if(node != null) root = node.getPsi();
final PsiFile containingFile = root.getContainingFile();
- final PsiFile[] psiRoots = containingFile.getPsiRoots();
- for (int i = 0; i < psiRoots.length; i++) {
- if(root == psiRoots[i]) return i;
+ FileViewProvider provider = containingFile.getViewProvider();
+ Set languages = provider.getLanguages();
+ if (languages.size() == 1) {
+ return 0;
}
- throw new RuntimeException("invalid element");
+ List array = new ArrayList(languages);
+ Collections.sort(array, LANGUAGE_COMPARATOR);
+ for (int i = 0; i < array.size(); i++) {
+ Language language = array.get(i);
+ if (provider.getPsi(language) == containingFile) return i;
+ }
+ throw new RuntimeException("Cannot find root for: "+root);
}
@NotNull
diff --git a/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java b/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java
index cb467e646318..2ba65b47b927 100644
--- a/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java
+++ b/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java
@@ -615,10 +615,8 @@ public abstract class CodeStyleAbstractPanel implements Disposable {
return myCurrentSettings;
}
- public void setupCopyFromMenu(Menu copyMenu) {
- if (copyMenu.getItemCount() > 0) {
- copyMenu.removeAll();
- }
+ public void setupCopyFromMenu(JPopupMenu copyMenu) {
+ copyMenu.removeAll();
}
public boolean isCopyFromMenuAvailable() {
diff --git a/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java b/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java
index d0732dd73fab..8de3532808a5 100644
--- a/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java
+++ b/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java
@@ -28,7 +28,6 @@ import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectUtil;
import com.intellij.openapi.util.Disposer;
-import com.intellij.openapi.util.IconLoader;
import com.intellij.psi.codeStyle.*;
import com.intellij.ui.components.JBTabbedPane;
import org.jetbrains.annotations.NotNull;
@@ -36,7 +35,8 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
-import java.awt.event.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -47,15 +47,12 @@ import java.util.List;
*/
public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPanel {
-
- private final static Icon COPY_ICON = IconLoader.getIcon("/actions/import.png");
-
private CodeStyleAbstractPanel myActiveTab;
private List myTabs;
private JPanel myPanel;
private JTabbedPane myTabbedPane;
private PredefinedCodeStyle[] myPredefinedCodeStyles;
- private PopupMenu myCopyFromMenu;
+ private JPopupMenu myCopyFromMenu;
protected TabbedLanguageCodeStylePanel(@Nullable Language language, CodeStyleSettings currentSettings, CodeStyleSettings settings) {
super(language, currentSettings, settings);
@@ -120,37 +117,22 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane
myTabs = new ArrayList();
myPanel.add(myTabbedPane);
initTabs(getSettings());
- addSetFrom();
}
assert !myTabs.isEmpty();
}
- private void addSetFrom() {
- myPredefinedCodeStyles = getPredefinedStyles();
- JLabel dummyLabel = new JLabel("");
- myTabbedPane.addTab("Set From...", dummyLabel);
- int dummyIndex = myTabbedPane.indexOfComponent(dummyLabel);
- myTabbedPane.setEnabledAt(dummyIndex, false);
- JPanel setFromPanel = new JPanel();
- setFromPanel.setBorder(BorderFactory.createEtchedBorder());
- setFromPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0));
- final JLabel setFromLabel = new JLabel("Set from...");
- setFromPanel.add(setFromLabel);
- setFromLabel.setIcon(COPY_ICON);
- setFromLabel.addMouseListener(new MouseAdapter() {
- @Override
- public void mousePressed(MouseEvent e) {
- initCopyFromMenu(setFromLabel);
- myCopyFromMenu.show(e.getComponent(), e.getX(), e.getY());
- }
- });
- myTabbedPane.setTabComponentAt(dummyIndex, setFromPanel);
+ public void showSetFrom(Object e) {
+ final Container component = (Container)e;
+ final Component[] components = component.getComponents();
+ final Component last = components[components.length - 1];
+ initCopyFromMenu(last);
+ myCopyFromMenu.show(last, 0, last.getHeight() + 3);
}
-
- private void initCopyFromMenu(JComponent parent) {
+
+ private void initCopyFromMenu(Component component) {
if (myCopyFromMenu == null) {
- myCopyFromMenu = new PopupMenu();
- parent.add(myCopyFromMenu);
+ myCopyFromMenu = new JPopupMenu();
+ //component.add(myCopyFromMenu);
setupCopyFromMenu(myCopyFromMenu);
}
}
@@ -283,13 +265,13 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane
@Override
- public void setupCopyFromMenu(Menu copyMenu) {
+ public void setupCopyFromMenu(JPopupMenu copyMenu) {
super.setupCopyFromMenu(copyMenu);
if (myPredefinedCodeStyles.length > 0) {
- Menu langs = new Menu("Language"); //TODO: Move to resource bundle
+ JMenuItem langs = new JMenuItem("Language"); //TODO: Move to resource bundle
copyMenu.add(langs);
fillLanguages(langs);
- Menu predefined = new Menu("Predefined Style"); //TODO: Move to resource bundle
+ JMenuItem predefined = new JMenuItem("Predefined Style"); //TODO: Move to resource bundle
copyMenu.add(predefined);
fillPredefined(predefined);
}
@@ -299,14 +281,14 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane
}
- private void fillLanguages(Menu parentMenu) {
+ private void fillLanguages(JComponent parentMenu) {
Language[] languages = LanguageCodeStyleSettingsProvider.getLanguagesWithCodeStyleSettings();
@SuppressWarnings("UnnecessaryFullyQualifiedName")
- java.util.List