mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Improved non-incremental switch analysis a bit (compile-server).
This commit is contained in:
@@ -136,6 +136,11 @@ public class ClassRepr extends Proto {
|
||||
public boolean hadValue() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean weakedAccess() {
|
||||
return diff.weakedAccess();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.jetbrains.ether.dependencyView;
|
||||
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import org.jetbrains.asm4.Opcodes;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@@ -12,6 +13,16 @@ import java.util.*;
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
abstract class Difference {
|
||||
public static boolean isPackageLocal(final int access) {
|
||||
return (access & (Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED | Opcodes.ACC_PUBLIC)) == 0;
|
||||
}
|
||||
|
||||
public static boolean weakerAccess(final int me, final int then) {
|
||||
return ((me & Opcodes.ACC_PRIVATE) > 0 && (then & Opcodes.ACC_PRIVATE) == 0) ||
|
||||
((me & Opcodes.ACC_PROTECTED) > 0 && (then & Opcodes.ACC_PUBLIC) > 0) ||
|
||||
(isPackageLocal(me) && (then & Opcodes.ACC_PROTECTED) > 0);
|
||||
}
|
||||
|
||||
public static final int NONE = 0;
|
||||
public static final int ACCESS = 1;
|
||||
public static final int TYPE = 2;
|
||||
@@ -21,8 +32,11 @@ abstract class Difference {
|
||||
|
||||
public interface Specifier<T> {
|
||||
Collection<T> added();
|
||||
|
||||
Collection<T> removed();
|
||||
|
||||
Collection<Pair<T, Difference>> changed();
|
||||
|
||||
boolean unchanged();
|
||||
}
|
||||
|
||||
@@ -105,11 +119,13 @@ abstract class Difference {
|
||||
|
||||
public abstract boolean no();
|
||||
|
||||
public abstract boolean weakedAccess();
|
||||
|
||||
public abstract int addedModifiers();
|
||||
|
||||
public abstract int removedModifiers();
|
||||
|
||||
public abstract boolean packageLocalOn();
|
||||
|
||||
public abstract boolean hadValue ();
|
||||
public abstract boolean hadValue();
|
||||
}
|
||||
|
||||
@@ -733,19 +733,9 @@ public class Mappings {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isPackageLocal(final int access) {
|
||||
return (access & (Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED | Opcodes.ACC_PUBLIC)) == 0;
|
||||
}
|
||||
|
||||
private static boolean weakerAccess(final int me, final int then) {
|
||||
return ((me & Opcodes.ACC_PRIVATE) > 0 && (then & Opcodes.ACC_PRIVATE) == 0) ||
|
||||
((me & Opcodes.ACC_PROTECTED) > 0 && (then & Opcodes.ACC_PUBLIC) > 0) ||
|
||||
(isPackageLocal(me) && (then & Opcodes.ACC_PROTECTED) > 0);
|
||||
}
|
||||
|
||||
private static boolean isVisibleIn(final ClassRepr c, final ProtoMember m, final ClassRepr scope) {
|
||||
final boolean privacy = ((m.access & Opcodes.ACC_PRIVATE) > 0) && c.name != scope.name;
|
||||
final boolean packageLocality = isPackageLocal(m.access) && !c.getPackageName().equals(scope.getPackageName());
|
||||
final boolean packageLocality = Difference.isPackageLocal(m.access) && !c.getPackageName().equals(scope.getPackageName());
|
||||
|
||||
return !privacy && !packageLocality;
|
||||
}
|
||||
@@ -1080,7 +1070,7 @@ public class Mappings {
|
||||
|
||||
final Option<Boolean> subtypeOf = u.isSubtypeOf(mm.type, m.type);
|
||||
|
||||
if (weakerAccess(mm.access, m.access) ||
|
||||
if (Difference.weakerAccess(mm.access, m.access) ||
|
||||
((m.access & Opcodes.ACC_STATIC) > 0 && (mm.access & Opcodes.ACC_STATIC) == 0) ||
|
||||
((m.access & Opcodes.ACC_STATIC) == 0 && (mm.access & Opcodes.ACC_STATIC) > 0) ||
|
||||
((m.access & Opcodes.ACC_FINAL) > 0) ||
|
||||
@@ -1382,7 +1372,7 @@ public class Mappings {
|
||||
final boolean ffPrivate = (ff.access & Opcodes.ACC_PRIVATE) > 0;
|
||||
final boolean ffProtected = (ff.access & Opcodes.ACC_PROTECTED) > 0;
|
||||
final boolean ffPublic = (ff.access & Opcodes.ACC_PUBLIC) > 0;
|
||||
final boolean ffPLocal = isPackageLocal(ff.access);
|
||||
final boolean ffPLocal = Difference.isPackageLocal(ff.access);
|
||||
|
||||
if (!ffPrivate) {
|
||||
final TIntHashSet propagated = o.propagateFieldAccess(ff.name, cc.name);
|
||||
@@ -1444,12 +1434,17 @@ public class Mappings {
|
||||
debug("Field: ", it.name);
|
||||
|
||||
if ((field.access & Opcodes.ACC_PRIVATE) == 0 && (field.access & mask) == mask) {
|
||||
if ((d.base() & Difference.ACCESS) > 0 || ((d.base() & Difference.VALUE) > 0 && d.hadValue())) {
|
||||
debug("Inline field changed its access or value => a switch to non-incremental mode requested");
|
||||
if (!incrementalDecision(it.name, field, affectedFiles, filter)) {
|
||||
debug("End of Differentiate, returning false");
|
||||
return false;
|
||||
}
|
||||
final int changedModifiers = d.addedModifiers() | d.removedModifiers();
|
||||
final boolean harmful = (changedModifiers & (Opcodes.ACC_STATIC | Opcodes.ACC_FINAL)) > 0;
|
||||
final boolean accessChanged = (changedModifiers & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED)) > 0;
|
||||
final boolean valueChanged = (d.base() & Difference.VALUE) > 0 && d.hadValue();
|
||||
|
||||
if (harmful || valueChanged || (accessChanged && !d.weakedAccess())) {
|
||||
debug("Inline field changed it's access or value => a switch to non-incremental mode requested");
|
||||
if (!incrementalDecision(it.name, field, affectedFiles, filter)) {
|
||||
debug("End of Differentiate, returning false");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -85,6 +85,11 @@ class MethodRepr extends ProtoMember {
|
||||
public boolean hadValue() {
|
||||
return ((MethodRepr)past).hasValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean weakedAccess() {
|
||||
return diff.weakedAccess();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package org.jetbrains.ether.dependencyView;
|
||||
|
||||
import groovyjarjarasm.asm.Opcodes;
|
||||
import org.jetbrains.asm4.Opcodes;
|
||||
import org.jetbrains.ether.RW;
|
||||
|
||||
import java.io.DataInput;
|
||||
@@ -86,17 +86,19 @@ class Proto implements RW.Savable {
|
||||
public boolean packageLocalOn() {
|
||||
return ((past.access & Opcodes.ACC_PRIVATE) != 0 ||
|
||||
(past.access & Opcodes.ACC_PUBLIC) != 0 ||
|
||||
(past.access & Opcodes.ACC_PROTECTED) != 0)
|
||||
|
||||
&&
|
||||
|
||||
((access & Opcodes.ACC_PRIVATE) == 0 && (access & Opcodes.ACC_PROTECTED) == 0 && (access & Opcodes.ACC_PUBLIC) == 0);
|
||||
(past.access & Opcodes.ACC_PROTECTED) != 0) &&
|
||||
Difference.isPackageLocal(access);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hadValue() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean weakedAccess() {
|
||||
return Difference.weakerAccess(past.access, access);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,6 +172,11 @@ abstract class ProtoMember extends Proto {
|
||||
public boolean hadValue() {
|
||||
return ((ProtoMember)past).hasValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean weakedAccess() {
|
||||
return diff.weakedAccess();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user