mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -148,7 +148,8 @@ public class JavaCompletionData extends JavaAwareCompletionData{
|
||||
not(
|
||||
or(psiElement(PsiTypeCastExpression.class),
|
||||
psiElement(PsiSwitchLabelStatement.class),
|
||||
psiElement(PsiExpressionStatement.class)
|
||||
psiElement(PsiExpressionStatement.class),
|
||||
psiElement(PsiPrefixExpression.class)
|
||||
)
|
||||
)
|
||||
)),
|
||||
|
||||
+9
-2
@@ -689,8 +689,15 @@ public class HighlightClassUtil {
|
||||
return null;
|
||||
}
|
||||
final PsiClass aClass = (PsiClass)grand;
|
||||
final PsiClass containerClass;
|
||||
if (aClass instanceof PsiTypeParameter) {
|
||||
return null;
|
||||
final PsiTypeParameterListOwner owner = ((PsiTypeParameter)aClass).getOwner();
|
||||
if (!(owner instanceof PsiClass)) {
|
||||
return null;
|
||||
}
|
||||
containerClass = (PsiClass)owner;
|
||||
} else {
|
||||
containerClass = aClass;
|
||||
}
|
||||
if (aClass.getExtendsList() != parent && aClass.getImplementsList() != parent) {
|
||||
return null;
|
||||
@@ -713,7 +720,7 @@ public class HighlightClassUtil {
|
||||
if (resolve instanceof PsiClass) {
|
||||
final PsiClass base = (PsiClass)resolve;
|
||||
final PsiClass baseClass = base.getContainingClass();
|
||||
if (baseClass != null && base.hasModifierProperty(PsiModifier.PRIVATE) && !PsiTreeUtil.isAncestor(baseClass, aClass, true)) {
|
||||
if (baseClass != null && base.hasModifierProperty(PsiModifier.PRIVATE) && baseClass == containerClass) {
|
||||
String description = JavaErrorMessages.message("private.symbol",
|
||||
HighlightUtil.formatClass(base),
|
||||
HighlightUtil.formatClass(baseClass));
|
||||
|
||||
@@ -628,6 +628,7 @@ public class PsiClassImplUtil {
|
||||
PsiElement place,
|
||||
ResolveState state,
|
||||
boolean isRaw, PsiElementFactory factory) {
|
||||
boolean resolved = false;
|
||||
for (final PsiClassType superType : aClass.getSuperTypes()) {
|
||||
final PsiClassType.ClassResolveResult superTypeResolveResult = superType.resolveGenerics();
|
||||
PsiClass superClass = superTypeResolveResult.getElement();
|
||||
@@ -635,10 +636,10 @@ public class PsiClassImplUtil {
|
||||
PsiSubstitutor finalSubstitutor = obtainFinalSubstitutor(superClass, superTypeResolveResult.getSubstitutor(), aClass, state.get(PsiSubstitutor.KEY),
|
||||
place, factory);
|
||||
if (!processDeclarationsInClass(superClass, processor, state.put(PsiSubstitutor.KEY, finalSubstitutor), visited, last, place, isRaw)) {
|
||||
return false;
|
||||
resolved = true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return !resolved;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
+42
-17
@@ -15,17 +15,15 @@
|
||||
*/
|
||||
package com.intellij.psi.impl.source.resolve;
|
||||
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.PsiImplUtil;
|
||||
import com.intellij.psi.infos.CandidateInfo;
|
||||
import com.intellij.psi.infos.ClassCandidateInfo;
|
||||
import com.intellij.psi.scope.BaseScopeProcessor;
|
||||
import com.intellij.psi.scope.ElementClassHint;
|
||||
import com.intellij.psi.scope.JavaScopeProcessorEvent;
|
||||
import com.intellij.psi.scope.NameHint;
|
||||
import com.intellij.psi.scope.PsiScopeProcessor;
|
||||
import com.intellij.psi.scope.*;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.util.SmartList;
|
||||
|
||||
import java.util.Iterator;
|
||||
@@ -49,15 +47,21 @@ public class ClassResolverProcessor extends BaseScopeProcessor implements NameHi
|
||||
if (((JavaCodeFragment)file).getVisibilityChecker() != null) place = null;
|
||||
}
|
||||
myPlace = place;
|
||||
if (place instanceof PsiReferenceExpression) {
|
||||
final PsiReferenceExpression expression = (PsiReferenceExpression)place;
|
||||
final PsiExpression qualifierExpression = expression.getQualifierExpression();
|
||||
if (qualifierExpression != null) {
|
||||
final PsiType type = qualifierExpression.getType();
|
||||
if (place instanceof PsiJavaCodeReferenceElement) {
|
||||
final PsiJavaCodeReferenceElement expression = (PsiJavaCodeReferenceElement)place;
|
||||
final PsiElement qualifierExpression = expression.getQualifier();
|
||||
if (qualifierExpression instanceof PsiExpression) {
|
||||
final PsiType type = ((PsiExpression)qualifierExpression).getType();
|
||||
if (type instanceof PsiClassType) {
|
||||
myAccessClass = ((PsiClassType)type).resolve();
|
||||
}
|
||||
}
|
||||
else if (qualifierExpression instanceof PsiJavaCodeReferenceElement) {
|
||||
final PsiElement resolve = ((PsiJavaCodeReferenceElement)qualifierExpression).resolve();
|
||||
if (resolve instanceof PsiClass) {
|
||||
myAccessClass = (PsiClass)resolve;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,13 +136,23 @@ public class ClassResolverProcessor extends BaseScopeProcessor implements NameHi
|
||||
|
||||
final PsiClass containingClass1 = aClass.getContainingClass();
|
||||
final PsiClass containingClass2 = otherClass.getContainingClass();
|
||||
if (containingClass1 != null && containingClass2 != null && containingClass2.isInheritor(containingClass1, true) &&
|
||||
!isImported(myCurrentFileContext)) {
|
||||
// shadowing
|
||||
return Domination.DOMINATED_BY;
|
||||
if (myAccessClass != null && !Comparing.equal(containingClass1, containingClass2)) {
|
||||
if (myAccessClass.equals(containingClass1)) return Domination.DOMINATES;
|
||||
if (myAccessClass.equals(containingClass2)) return Domination.DOMINATED_BY;
|
||||
}
|
||||
|
||||
boolean infoAccessible = info.isAccessible();
|
||||
//JLS 8.5:
|
||||
//A class may inherit two or more type declarations with the same name, either from two interfaces or from its superclass and an interface.
|
||||
//It is a compile-time error to attempt to refer to any ambiguously inherited class or interface by its simple name.
|
||||
if (containingClass1 != null && containingClass2 != null && containingClass2.isInheritor(containingClass1, true) &&
|
||||
!isImported(myCurrentFileContext)) {
|
||||
if (!isAmbiguousInherited(containingClass1)) {
|
||||
// shadowing
|
||||
return Domination.DOMINATED_BY;
|
||||
}
|
||||
}
|
||||
|
||||
boolean infoAccessible = info.isAccessible() && !otherClass.hasModifierProperty(PsiModifier.PRIVATE);
|
||||
if (infoAccessible && !accessible) {
|
||||
return Domination.DOMINATED_BY;
|
||||
}
|
||||
@@ -169,6 +183,17 @@ public class ClassResolverProcessor extends BaseScopeProcessor implements NameHi
|
||||
return Domination.EQUAL;
|
||||
}
|
||||
|
||||
private boolean isAmbiguousInherited(PsiClass containingClass1) {
|
||||
PsiClass psiClass = PsiTreeUtil.getParentOfType(myPlace, PsiClass.class);
|
||||
while (psiClass != null) {
|
||||
if (psiClass.isInheritor(containingClass1, false)) {
|
||||
return true;
|
||||
}
|
||||
psiClass = psiClass.getContainingClass();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean execute(PsiElement element, ResolveState state) {
|
||||
if (!(element instanceof PsiClass)) return true;
|
||||
@@ -187,7 +212,7 @@ public class ClassResolverProcessor extends BaseScopeProcessor implements NameHi
|
||||
for (int i = myCandidates.size()-1; i>=0; i--) {
|
||||
ClassCandidateInfo info = myCandidates.get(i);
|
||||
|
||||
Domination domination = dominates(aClass, accessible, fqName, info);
|
||||
Domination domination = dominates(aClass, accessible && !aClass.hasModifierProperty(PsiModifier.PRIVATE), fqName, info);
|
||||
if (domination == Domination.DOMINATED_BY) {
|
||||
return true;
|
||||
}
|
||||
@@ -202,7 +227,7 @@ public class ClassResolverProcessor extends BaseScopeProcessor implements NameHi
|
||||
myHasInaccessibleCandidate |= !accessible;
|
||||
myCandidates.add(new ClassCandidateInfo(aClass, state.get(PsiSubstitutor.KEY), !accessible, myCurrentFileContext));
|
||||
myResult = null;
|
||||
if (!accessible) return true;
|
||||
if (!accessible || aClass.hasModifierProperty(PsiModifier.PRIVATE)) return true;
|
||||
return myCurrentFileContext instanceof PsiImportStatementBase;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
class Foo {
|
||||
{
|
||||
++nu<caret>
|
||||
}
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
public class Main {
|
||||
static interface A
|
||||
{
|
||||
interface B { }
|
||||
}
|
||||
|
||||
static class D implements A
|
||||
{
|
||||
private interface B { }
|
||||
}
|
||||
|
||||
|
||||
static class C extends D implements A
|
||||
{
|
||||
interface E extends B { }
|
||||
interface E1 extends D.B { }
|
||||
interface E2 extends A.B { }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
class Main1 {
|
||||
static interface A
|
||||
{
|
||||
interface B { }
|
||||
}
|
||||
|
||||
static class D implements A
|
||||
{
|
||||
interface B { }
|
||||
}
|
||||
|
||||
|
||||
static class C extends D implements A
|
||||
{
|
||||
interface E extends <error descr="Reference to 'B' is ambiguous, both 'Main1.D.B' and 'Main1.A.B' match">B</error> { }
|
||||
interface E1 extends D.B {
|
||||
}
|
||||
interface E2 extends A.B { }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
interface A
|
||||
{
|
||||
interface B { }
|
||||
interface B1 { }
|
||||
}
|
||||
|
||||
class D implements A
|
||||
{
|
||||
private interface B { }
|
||||
interface B1 { }
|
||||
}
|
||||
|
||||
|
||||
class C extends D implements A
|
||||
{
|
||||
interface E extends B { }
|
||||
interface E1 extends D.<error descr="'D.B' has private access in 'D'">B</error> { }
|
||||
interface E2 extends A.B { }
|
||||
|
||||
interface F extends <error descr="Reference to 'B1' is ambiguous, both 'D.B1' and 'A.B1' match">B1</error> { }
|
||||
interface F1 extends D.B1 { }
|
||||
interface F2 extends A.B1 { }
|
||||
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
class A<T extends <error descr="'A.B' has private access in 'A'">A<T>.B</error>> {
|
||||
private class B {}
|
||||
}
|
||||
+1
@@ -539,6 +539,7 @@ public class ListUtils {
|
||||
}
|
||||
|
||||
public void testNoThisInComment() throws Throwable { doAntiTest() }
|
||||
public void testIncNull() throws Throwable { doAntiTest() }
|
||||
|
||||
public void testLastExpressionInFor() throws Throwable { doTest(); }
|
||||
|
||||
|
||||
+1
@@ -87,6 +87,7 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase {
|
||||
public void testDiamondNeg14() throws Exception { doTest(false, false); }
|
||||
public void testDiamondMisc() throws Exception { doTest(false, false); }
|
||||
public void testHighlightInaccessibleFromClassModifierList() throws Exception { doTest(false, false); }
|
||||
public void testInnerInTypeArguments() throws Exception { doTest(false, false); }
|
||||
|
||||
public void testDynamicallyAddIgnoredAnnotations() throws Exception {
|
||||
ExtensionPoint<EntryPoint> point = Extensions.getRootArea().getExtensionPoint(ExtensionPoints.DEAD_CODE_TOOL);
|
||||
|
||||
@@ -194,6 +194,7 @@ public class LightAdvHighlightingTest extends LightDaemonAnalyzerTestCase {
|
||||
public void testDefaultPackageClassInStaticImport() throws Exception { doTest(false, false); }
|
||||
|
||||
public void testUnusedParamsOfPublicMethod() throws Exception { doTest(true, false); }
|
||||
public void testInnerClassesShadowing() throws Exception { doTest(false, false); }
|
||||
|
||||
public void testUnusedParamsOfPublicMethodDisabled() throws Exception {
|
||||
myUnusedSymbolLocalInspection.REPORT_PARAMETER_FOR_PUBLIC_METHODS = false;
|
||||
|
||||
@@ -20,6 +20,9 @@ import gnu.trove.TIntObjectProcedure;
|
||||
import gnu.trove.TIntProcedure;
|
||||
|
||||
import java.io.PrintStream;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
@@ -63,15 +66,23 @@ abstract class IntIntMultiMaplet implements Streamable {
|
||||
stream.println(context.getValue(a));
|
||||
stream.println(" Values:");
|
||||
|
||||
final List<String> list = new LinkedList<String>();
|
||||
|
||||
b.forEach(new TIntProcedure() {
|
||||
@Override
|
||||
public boolean execute(final int value) {
|
||||
stream.print(" ");
|
||||
stream.println(context.getValue(value));
|
||||
|
||||
list.add(context.getValue(value));
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
Collections.sort(list);
|
||||
|
||||
for (final String l : list) {
|
||||
stream.print(" ");
|
||||
stream.println(l);
|
||||
}
|
||||
|
||||
stream.println(" End Of Values");
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -17,8 +17,12 @@ package org.jetbrains.ether.dependencyView;
|
||||
|
||||
import gnu.trove.TIntObjectProcedure;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
@@ -62,8 +66,21 @@ abstract class IntObjectMultiMaplet<V extends Streamable> implements Streamable
|
||||
stream.println(context.getValue(a));
|
||||
stream.println(" Values:");
|
||||
|
||||
final List<String> list = new LinkedList<String> ();
|
||||
|
||||
for (final V value : b) {
|
||||
value.toStream(context, stream);
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
final PrintStream s = new PrintStream(baos);
|
||||
|
||||
value.toStream(context, s);
|
||||
|
||||
list.add(baos.toString());
|
||||
}
|
||||
|
||||
Collections.sort(list);
|
||||
|
||||
for (final String l : list) {
|
||||
stream.print(l);
|
||||
}
|
||||
|
||||
stream.println(" End Of Values");
|
||||
|
||||
@@ -35,6 +35,8 @@ public class ProjectScopeImpl extends GlobalSearchScope {
|
||||
public boolean contains(VirtualFile file) {
|
||||
if (file instanceof VirtualFileWindow) return true;
|
||||
|
||||
if (myFileIndex.isInLibraryClasses(file) && !myFileIndex.isInSourceContent(file)) return false;
|
||||
|
||||
return myFileIndex.isInContent(file);
|
||||
}
|
||||
|
||||
|
||||
@@ -460,7 +460,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable
|
||||
updateListHeight(listModel);
|
||||
|
||||
myList.setSelectedIndex(toSelect);
|
||||
return Arrays.equals(oldModel, items.toArray());
|
||||
return !Arrays.equals(oldModel, items.toArray());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1260,7 +1260,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable
|
||||
}
|
||||
Rectangle rectangle = calculatePosition();
|
||||
myMaximumHeight = rectangle.height;
|
||||
|
||||
|
||||
if (myResizePending || itemsChanged) {
|
||||
myResizePending = false;
|
||||
pack();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2011 JetBrains s.r.o.
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -20,13 +20,16 @@ import com.intellij.ide.actions.CopyAction;
|
||||
import com.intellij.ide.actions.CutAction;
|
||||
import com.intellij.openapi.actionSystem.*;
|
||||
import com.intellij.openapi.actionSystem.ex.AnActionListener;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ModuleRootEvent;
|
||||
import com.intellij.openapi.roots.ModuleRootListener;
|
||||
import com.intellij.openapi.ui.popup.JBPopupFactory;
|
||||
import com.intellij.openapi.util.ActionCallback;
|
||||
import com.intellij.openapi.vcs.FileStatusListener;
|
||||
import com.intellij.openapi.vcs.FileStatusManager;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.wm.IdeFocusManager;
|
||||
import com.intellij.problems.WolfTheProblemSolver;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.psi.PsiTreeChangeEvent;
|
||||
@@ -36,10 +39,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.FocusListener;
|
||||
import java.awt.event.*;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.util.List;
|
||||
@@ -49,7 +49,7 @@ import java.util.List;
|
||||
*/
|
||||
public class NavBarListener extends WolfTheProblemSolver.ProblemListener
|
||||
implements ActionListener, FocusListener, FileStatusListener, AnActionListener,
|
||||
PsiTreeChangeListener, ModuleRootListener, NavBarModelListener, PropertyChangeListener {
|
||||
PsiTreeChangeListener, ModuleRootListener, NavBarModelListener, PropertyChangeListener, KeyListener {
|
||||
private static final String LISTENER = "NavBarListener";
|
||||
private static final String BUS = "NavBarMessageBus";
|
||||
private final NavBarPanel myPanel;
|
||||
@@ -71,6 +71,7 @@ public class NavBarListener extends WolfTheProblemSolver.ProblemListener
|
||||
connection.subscribe(ProjectTopics.PROJECT_ROOTS, listener);
|
||||
connection.subscribe(NavBarModelListener.NAV_BAR, listener);
|
||||
panel.putClientProperty(BUS, connection);
|
||||
panel.addKeyListener(listener);
|
||||
}
|
||||
|
||||
static void unsubscribeFrom(NavBarPanel panel) {
|
||||
@@ -256,7 +257,46 @@ public class NavBarListener extends WolfTheProblemSolver.ProblemListener
|
||||
|| action instanceof CutAction;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void keyPressed(final KeyEvent e) {
|
||||
if (!(e.isAltDown() || e.isMetaDown() || e.isControlDown() || myPanel.isNodePopupActive())) {
|
||||
if (!Character.isLetter(e.getKeyChar())) {
|
||||
return;
|
||||
}
|
||||
|
||||
final IdeFocusManager focusManager = IdeFocusManager.getInstance(myPanel.getProject());
|
||||
final ActionCallback firstCharTyped = new ActionCallback();
|
||||
focusManager.typeAheadUntil(firstCharTyped);
|
||||
myPanel.moveDown();
|
||||
ApplicationManager.getApplication().invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
final Robot robot = new Robot();
|
||||
final boolean shiftOn = e.isShiftDown();
|
||||
final int code = e.getKeyCode();
|
||||
if (shiftOn) {
|
||||
robot.keyPress(KeyEvent.VK_SHIFT);
|
||||
}
|
||||
robot.keyPress(code);
|
||||
robot.keyRelease(code);
|
||||
|
||||
//don't release Shift
|
||||
firstCharTyped.setDone();
|
||||
}
|
||||
catch (AWTException ignored) {
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//---- Ignored
|
||||
@Override
|
||||
public void keyTyped(KeyEvent e) {}
|
||||
|
||||
@Override
|
||||
public void keyReleased(KeyEvent e) {}
|
||||
|
||||
@Override
|
||||
public void beforeActionPerformed(AnAction action, DataContext dataContext, AnActionEvent event) {}
|
||||
|
||||
|
||||
+73
-38
@@ -21,17 +21,15 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.projectRoots.Sdk;
|
||||
import com.intellij.openapi.roots.*;
|
||||
import com.intellij.openapi.roots.libraries.Library;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import gnu.trove.THashSet;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
@@ -39,7 +37,7 @@ import java.util.Set;
|
||||
*/
|
||||
public class LibraryRuntimeClasspathScope extends GlobalSearchScope {
|
||||
private final ProjectFileIndex myIndex;
|
||||
private final LinkedHashSet<VirtualFile> myEntries = new LinkedHashSet<VirtualFile>();
|
||||
private final LinkedHashMap<VirtualFile, Integer> myEntries = new LinkedHashMap<VirtualFile, Integer>();
|
||||
|
||||
public LibraryRuntimeClasspathScope(final Project project, final List<Module> modules) {
|
||||
super(project);
|
||||
@@ -47,45 +45,68 @@ public class LibraryRuntimeClasspathScope extends GlobalSearchScope {
|
||||
final Set<Sdk> processedSdk = new THashSet<Sdk>();
|
||||
final Set<Library> processedLibraries = new THashSet<Library>();
|
||||
|
||||
ProjectRootManager.getInstance(project).orderEntries(modules).recursively().process(new RootPolicy<LinkedHashSet<VirtualFile>>() {
|
||||
public LinkedHashSet<VirtualFile> visitLibraryOrderEntry(final LibraryOrderEntry libraryOrderEntry,
|
||||
final LinkedHashSet<VirtualFile> value) {
|
||||
final Library library = libraryOrderEntry.getLibrary();
|
||||
if (library != null && processedLibraries.add(library)) {
|
||||
ContainerUtil.addAll(value, libraryOrderEntry.getRootFiles(OrderRootType.CLASSES));
|
||||
}
|
||||
return value;
|
||||
ProjectRootManager.getInstance(project).orderEntries(modules).recursively()
|
||||
.process(new RootPolicy<LinkedHashMap<VirtualFile, Integer>>() {
|
||||
@Override
|
||||
public LinkedHashMap<VirtualFile, Integer> visitLibraryOrderEntry(final LibraryOrderEntry libraryOrderEntry,
|
||||
final LinkedHashMap<VirtualFile, Integer> value) {
|
||||
final Library library = libraryOrderEntry.getLibrary();
|
||||
if (library != null && processedLibraries.add(library)) {
|
||||
addAll(value, libraryOrderEntry.getRootFiles(OrderRootType.CLASSES));
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public LinkedHashSet<VirtualFile> visitModuleSourceOrderEntry(final ModuleSourceOrderEntry moduleSourceOrderEntry,
|
||||
final LinkedHashSet<VirtualFile> value) {
|
||||
ContainerUtil.addAll(value, moduleSourceOrderEntry.getFiles(OrderRootType.SOURCES));
|
||||
return value;
|
||||
}
|
||||
@Override
|
||||
public LinkedHashMap<VirtualFile, Integer> visitModuleSourceOrderEntry(final ModuleSourceOrderEntry moduleSourceOrderEntry,
|
||||
final LinkedHashMap<VirtualFile, Integer> value) {
|
||||
addAll(value, moduleSourceOrderEntry.getFiles(OrderRootType.SOURCES));
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LinkedHashSet<VirtualFile> visitModuleOrderEntry(ModuleOrderEntry moduleOrderEntry, LinkedHashSet<VirtualFile> value) {
|
||||
final Module depModule = moduleOrderEntry.getModule();
|
||||
if (depModule != null) {
|
||||
ContainerUtil.addAll(value, ModuleRootManager.getInstance(depModule).getSourceRoots());
|
||||
}
|
||||
return value;
|
||||
@Override
|
||||
public LinkedHashMap<VirtualFile, Integer> visitModuleOrderEntry(ModuleOrderEntry moduleOrderEntry,
|
||||
LinkedHashMap<VirtualFile, Integer> value) {
|
||||
final Module depModule = moduleOrderEntry.getModule();
|
||||
if (depModule != null) {
|
||||
addAll(value, ModuleRootManager.getInstance(depModule).getSourceRoots());
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public LinkedHashSet<VirtualFile> visitJdkOrderEntry(final JdkOrderEntry jdkOrderEntry, final LinkedHashSet<VirtualFile> value) {
|
||||
final Sdk jdk = jdkOrderEntry.getJdk();
|
||||
if (jdk != null && processedSdk.add(jdk)) {
|
||||
ContainerUtil.addAll(value, jdkOrderEntry.getRootFiles(OrderRootType.CLASSES));
|
||||
}
|
||||
return value;
|
||||
@Override
|
||||
public LinkedHashMap<VirtualFile, Integer> visitJdkOrderEntry(JdkOrderEntry jdkOrderEntry,
|
||||
LinkedHashMap<VirtualFile, Integer> value) {
|
||||
final Sdk jdk = jdkOrderEntry.getJdk();
|
||||
if (jdk != null && processedSdk.add(jdk)) {
|
||||
addAll(value, jdkOrderEntry.getRootFiles(OrderRootType.CLASSES));
|
||||
}
|
||||
}, myEntries);
|
||||
return value;
|
||||
}
|
||||
}, myEntries);
|
||||
|
||||
fillIndexes();
|
||||
}
|
||||
|
||||
public LibraryRuntimeClasspathScope(Project project, LibraryOrderEntry entry) {
|
||||
super(project);
|
||||
myIndex = ProjectRootManager.getInstance(project).getFileIndex();
|
||||
Collections.addAll(myEntries, entry.getRootFiles(OrderRootType.CLASSES));
|
||||
addAll(myEntries, entry.getRootFiles(OrderRootType.CLASSES));
|
||||
|
||||
fillIndexes();
|
||||
}
|
||||
|
||||
private void fillIndexes() {
|
||||
int i = 0;
|
||||
for (Map.Entry<VirtualFile, Integer> entry : myEntries.entrySet()) {
|
||||
entry.setValue(i++);
|
||||
}
|
||||
}
|
||||
|
||||
private static void addAll(Map<VirtualFile, Integer> map, VirtualFile[] files) {
|
||||
for (VirtualFile file : files) {
|
||||
map.put(file, null);
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
@@ -101,7 +122,7 @@ public class LibraryRuntimeClasspathScope extends GlobalSearchScope {
|
||||
}
|
||||
|
||||
public boolean contains(VirtualFile file) {
|
||||
return myEntries.contains(getFileRoot(file));
|
||||
return myEntries.containsKey(getFileRoot(file));
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -121,11 +142,25 @@ public class LibraryRuntimeClasspathScope extends GlobalSearchScope {
|
||||
public int compare(VirtualFile file1, VirtualFile file2) {
|
||||
final VirtualFile r1 = getFileRoot(file1);
|
||||
final VirtualFile r2 = getFileRoot(file2);
|
||||
for (VirtualFile root : myEntries) {
|
||||
if (r1 == root) return 1;
|
||||
if (r2 == root) return -1;
|
||||
|
||||
//for (VirtualFile root : myEntries) {
|
||||
// if (r1 == root) return 1;
|
||||
// if (r2 == root) return -1;
|
||||
//}
|
||||
//return 0;
|
||||
|
||||
Integer index1 = myEntries.get(r1);
|
||||
Integer index2 = myEntries.get(r2);
|
||||
|
||||
if (index1 == null) {
|
||||
return index2 == null ? 0 : -1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
if (index2 == null) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return index2.compareTo(index1);
|
||||
}
|
||||
|
||||
public boolean isSearchInModuleContent(@NotNull Module aModule) {
|
||||
|
||||
@@ -138,6 +138,16 @@ public class IdeaApplication {
|
||||
setWM(xwm, "METACITY_WM"); // Mutter support absent - mimic Metacity
|
||||
}
|
||||
}
|
||||
else if ("Muffin".equals(wmName)) {
|
||||
// Muffin is completely unsupported at the moment - so mimic Mutter if possible, Metacity otherwise
|
||||
try {
|
||||
xwmClass.getDeclaredField("MUTTER_WM");
|
||||
setWM(xwm, "MUTTER_WM");
|
||||
}
|
||||
catch (NoSuchFieldException e) {
|
||||
setWM(xwm, "METACITY_WM");
|
||||
}
|
||||
}
|
||||
else if ("awesome".equals(wmName)) {
|
||||
try {
|
||||
xwmClass.getDeclaredField("OTHER_NONREPARENTING_WM");
|
||||
|
||||
@@ -640,6 +640,22 @@ public class Main {
|
||||
CompileServerManager.instance.shutdownServer()
|
||||
}
|
||||
|
||||
public void "_test make stub-level error and correct it"() {
|
||||
def foo = myFixture.addFileToProject('Foo.groovy', 'class Foo { }')
|
||||
myFixture.addFileToProject('Bar.java', 'class Bar extends Foo {}')
|
||||
|
||||
assertEmpty make()
|
||||
|
||||
setFileText(foo, 'class Foo implements Runnabl {}')
|
||||
|
||||
shouldFail { make() }
|
||||
|
||||
setFileText(foo, 'class Foo {}')
|
||||
|
||||
assertEmpty make()
|
||||
}
|
||||
|
||||
//todo jeka: when recompiling module, delete all class files including those with excluded source
|
||||
public void "_test reporting module compile errors caused by missing files excluded from compilation"() {
|
||||
def foo = myFixture.addFileToProject('Foo.groovy', 'class Foo {}')
|
||||
myFixture.addFileToProject('Bar.groovy', 'class Bar extends Foo {}')
|
||||
|
||||
Reference in New Issue
Block a user