home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.java;
-
- import java.io.PrintStream;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Vector;
- import sun.tools.tree.Context;
- import sun.tools.tree.Expression;
- import sun.tools.tree.LocalField;
- import sun.tools.tree.UplevelReference;
- import sun.tools.tree.Vset;
-
- public class ClassDefinition implements Constants {
- protected Object source;
- protected int where;
- protected int modifiers;
- protected Identifier localName;
- protected ClassDeclaration declaration;
- protected IdentifierToken superClassId;
- protected IdentifierToken[] interfaceIds;
- protected ClassDeclaration superClass;
- protected ClassDeclaration[] interfaces;
- protected ClassDefinition outerClass;
- protected FieldDefinition outerField;
- protected FieldDefinition innerClassField;
- protected FieldDefinition firstField;
- protected FieldDefinition lastField;
- protected boolean resolved;
- protected String documentation;
- protected boolean error;
- protected UplevelReference references;
- protected boolean referencesFrozen;
- private Hashtable fieldHash = new Hashtable(31);
- private int abstr;
-
- protected ClassDefinition(Object var1, int var2, ClassDeclaration var3, int var4, IdentifierToken var5, IdentifierToken[] var6) {
- this.source = var1;
- this.where = var2;
- this.declaration = var3;
- this.modifiers = var4;
- this.superClassId = var5;
- this.interfaceIds = var6;
- }
-
- public final Object getSource() {
- return this.source;
- }
-
- public final boolean getError() {
- return this.error;
- }
-
- public final void setError(boolean var1) {
- this.error = var1;
- }
-
- public final int getWhere() {
- return this.where;
- }
-
- public final ClassDeclaration getClassDeclaration() {
- return this.declaration;
- }
-
- public final int getModifiers() {
- return this.modifiers;
- }
-
- public final ClassDeclaration getSuperClass() {
- return this.superClass;
- }
-
- public ClassDeclaration getSuperClass(Environment var1) {
- if (this.superClass == null && this.superClassId != null) {
- this.resolveTypeStructure(var1);
- if (this.superClass == null && this.superClassId != null) {
- var1.error(this.where, "cyclic.scoping");
- }
- }
-
- return this.superClass;
- }
-
- public final ClassDeclaration[] getInterfaces() {
- if (this.interfaces == null) {
- throw new CompilerError("getInterfaces");
- } else {
- return this.interfaces;
- }
- }
-
- public final ClassDefinition getOuterClass() {
- return this.outerClass;
- }
-
- protected final void setOuterClass(ClassDefinition var1) {
- if (this.outerClass != null) {
- throw new CompilerError("setOuterClass");
- } else {
- this.outerClass = var1;
- }
- }
-
- protected final void setOuterField(FieldDefinition var1) {
- if (!this.isStatic() && this.isInnerClass()) {
- if (this.outerField != null) {
- throw new CompilerError("setOuterField");
- } else {
- this.outerField = var1;
- }
- } else {
- throw new CompilerError("setOuterField");
- }
- }
-
- public final boolean isInnerClass() {
- return this.outerClass != null;
- }
-
- public final boolean isMember() {
- return this.outerClass != null && !this.isLocal();
- }
-
- public final boolean isTopLevel() {
- return this.outerClass == null || this.isStatic() || this.isInterface();
- }
-
- public final boolean isInsideLocal() {
- return this.isLocal() || this.outerClass != null && this.outerClass.isInsideLocal();
- }
-
- public Identifier getLocalName() {
- return this.localName != null ? this.localName : this.getName().getFlatName().getName();
- }
-
- public void setLocalName(Identifier var1) {
- if (this.isLocal()) {
- this.localName = var1;
- }
-
- }
-
- public final FieldDefinition getInnerClassField() {
- if (this.outerClass == null) {
- return null;
- } else {
- if (this.innerClassField == null) {
- Identifier var1 = this.getName().getFlatName().getName();
-
- for(FieldDefinition var2 = this.outerClass.getFirstMatch(var1); var2 != null; var2 = var2.getNextMatch()) {
- if (var2.isInnerClass()) {
- this.innerClassField = var2;
- break;
- }
- }
-
- if (this.innerClassField == null) {
- throw new CompilerError("getInnerClassField");
- }
- }
-
- return this.innerClassField;
- }
- }
-
- public final FieldDefinition findOuterField() {
- return this.outerField;
- }
-
- public final boolean isStatic() {
- return (this.modifiers & 8) != 0;
- }
-
- public final ClassDefinition getTopClass() {
- ClassDefinition var1;
- ClassDefinition var2;
- for(var1 = this; (var2 = var1.outerClass) != null; var1 = var2) {
- }
-
- return var1;
- }
-
- public final FieldDefinition getFirstField() {
- return this.firstField;
- }
-
- public final FieldDefinition getFirstMatch(Identifier var1) {
- return (FieldDefinition)this.fieldHash.get(var1);
- }
-
- public final Identifier getName() {
- return this.declaration.getName();
- }
-
- public final Type getType() {
- return this.declaration.getType();
- }
-
- public String getDocumentation() {
- return this.documentation;
- }
-
- public static boolean containsDeprecated(String var0) {
- if (var0 == null) {
- return false;
- } else {
- int var5;
- for(var5 = 0; (var5 = var0.indexOf("@deprecated", var5)) >= 0; var5 += "@deprecated".length()) {
- int var2 = var5 - 1;
-
- while(true) {
- if (var2 >= 0) {
- char var3 = var0.charAt(var2);
- if (var3 != '\n' && var3 != '\r') {
- if (!Character.isSpace(var3)) {
- break;
- }
-
- --var2;
- continue;
- }
- }
-
- int var6 = var5 + "@deprecated".length();
- if (var6 >= var0.length()) {
- return true;
- }
-
- char var4 = var0.charAt(var6);
- if (var4 == '\n' || var4 == '\r' || Character.isSpace(var4)) {
- return true;
- }
- break;
- }
- }
-
- return false;
- }
- }
-
- public final boolean isInterface() {
- return (this.getModifiers() & 512) != 0;
- }
-
- public final boolean isClass() {
- return (this.getModifiers() & 512) == 0;
- }
-
- public final boolean isPublic() {
- return (this.getModifiers() & 1) != 0;
- }
-
- public final boolean isPrivate() {
- return (this.getModifiers() & 2) != 0;
- }
-
- public final boolean isProtected() {
- return (this.getModifiers() & 4) != 0;
- }
-
- public final boolean isFinal() {
- return (this.getModifiers() & 16) != 0;
- }
-
- public final boolean isAbstract() {
- return (this.getModifiers() & 1024) != 0;
- }
-
- public final boolean isAbstract(Environment var1) throws ClassNotFound {
- if (this.isAbstract()) {
- return true;
- } else {
- if (this.abstr == 0) {
- this.abstr = !this.isInterface() && !this.hasAbstractFields(var1) ? -1 : 1;
- }
-
- return this.abstr == 1;
- }
- }
-
- public final boolean isSynthetic() {
- return (this.getModifiers() & 524288) != 0;
- }
-
- public final boolean isDeprecated() {
- return (this.getModifiers() & 262144) != 0;
- }
-
- public final boolean isAnonymous() {
- return (this.getModifiers() & 65536) != 0;
- }
-
- public final boolean isLocal() {
- return (this.getModifiers() & 131072) != 0;
- }
-
- public final boolean hasConstructor() {
- return this.getFirstMatch(Constants.idInit) != null;
- }
-
- public Enumeration getAbstractFields(Environment var1) throws ClassNotFound {
- Vector var2 = new Vector();
- this.getAbstractFields(var1, this, var2);
- return var2.elements();
- }
-
- private void getAbstractFields(Environment var1, ClassDefinition var2, Vector var3) throws ClassNotFound {
- for(FieldDefinition var4 = var2.getFirstField(); var4 != null; var4 = var4.getNextField()) {
- if (var4.isAbstract()) {
- FieldDefinition var5 = this.findMethod(var1, var4.getName(), var4.getType());
- if (var5 == null) {
- var5 = var4;
- }
-
- if (var5.isAbstract() && !var3.contains(var5)) {
- var3.addElement(var5);
- }
- }
- }
-
- ClassDeclaration var7 = var2.getSuperClass();
- if (var7 != null) {
- ClassDefinition var6 = var7.getClassDefinition(var1);
- if (var6.isAbstract(var1)) {
- this.getAbstractFields(var1, var6, var3);
- }
- }
-
- }
-
- public boolean hasAbstractFields(Environment var1) throws ClassNotFound {
- return this.hasAbstractFields(var1, this);
- }
-
- private boolean hasAbstractFields(Environment var1, ClassDefinition var2) throws ClassNotFound {
- for(FieldDefinition var3 = var2.getFirstField(); var3 != null; var3 = var3.getNextField()) {
- if (var3.isAbstract() && var3.isMethod()) {
- FieldDefinition var4 = this.findMethod(var1, var3.getName(), var3.getType());
- if (var4 == null || var4.isAbstract()) {
- return true;
- }
- }
- }
-
- ClassDeclaration var6 = var2.getSuperClass();
- if (var6 != null) {
- ClassDefinition var5 = var6.getClassDefinition(var1);
- if (var5.isAbstract(var1) && this.hasAbstractFields(var1, var5)) {
- return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
-
- public boolean superClassOf(Environment var1, ClassDeclaration var2) throws ClassNotFound {
- while(var2 != null) {
- if (this.getClassDeclaration().equals(var2)) {
- return true;
- }
-
- var2 = var2.getClassDefinition(var1).getSuperClass();
- }
-
- return false;
- }
-
- public boolean enclosingClassOf(ClassDefinition var1) {
- while((var1 = var1.getOuterClass()) != null) {
- if (this == var1) {
- return true;
- }
- }
-
- return false;
- }
-
- public boolean subClassOf(Environment var1, ClassDeclaration var2) throws ClassNotFound {
- for(ClassDeclaration var3 = this.getClassDeclaration(); var3 != null; var3 = var3.getClassDefinition(var1).getSuperClass()) {
- if (var3.equals(var2)) {
- return true;
- }
- }
-
- return false;
- }
-
- public boolean implementedBy(Environment var1, ClassDeclaration var2) throws ClassNotFound {
- while(var2 != null) {
- if (this.getClassDeclaration().equals(var2)) {
- return true;
- }
-
- ClassDeclaration[] var3 = var2.getClassDefinition(var1).getInterfaces();
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- if (this.implementedBy(var1, var3[var4])) {
- return true;
- }
- }
-
- var2 = var2.getClassDefinition(var1).getSuperClass();
- }
-
- return false;
- }
-
- public boolean canAccess(Environment var1, ClassDeclaration var2) throws ClassNotFound {
- ClassDefinition var3 = var2.getClassDefinition(var1);
- if (var3.isLocal()) {
- return true;
- } else if (var3.isInnerClass()) {
- return this.canAccess(var1, var3.getInnerClassField());
- } else {
- return var3.isPublic() ? true : this.getName().getQualifier().equals(var2.getName().getQualifier());
- }
- }
-
- public boolean canAccess(Environment var1, FieldDefinition var2) throws ClassNotFound {
- if (var2.isPublic()) {
- return true;
- } else if (var2.isProtected() && this.subClassOf(var1, var2.getClassDeclaration())) {
- return true;
- } else {
- return var2.isPrivate() ? this.getTopClass().getClassDeclaration().equals(var2.getTopClass().getClassDeclaration()) : this.getName().getQualifier().equals(var2.getClassDeclaration().getName().getQualifier());
- }
- }
-
- public boolean protectedAccess(Environment var1, FieldDefinition var2, Type var3) throws ClassNotFound {
- return var2.isStatic() || var3.isType(9) && var2.getName() == Constants.idClone && var2.getType().getArgumentTypes().length == 0 || var3.isType(10) && var1.getClassDefinition(var3.getClassName()).subClassOf(var1, this.getClassDeclaration()) || this.getName().getQualifier().equals(var2.getClassDeclaration().getName().getQualifier());
- }
-
- public FieldDefinition getAccessField(Environment var1, Context var2, FieldDefinition var3) {
- return null;
- }
-
- public FieldDefinition getVariable(Environment var1, Identifier var2) throws AmbiguousField, ClassNotFound {
- for(FieldDefinition var3 = this.getFirstMatch(var2); var3 != null; var3 = var3.getNextMatch()) {
- if (var3.isVariable()) {
- return var3;
- }
- }
-
- ClassDeclaration var4 = this.getSuperClass();
- FieldDefinition var5 = var4 != null ? var4.getClassDefinition(var1).getVariable(var1, var2) : null;
-
- for(int var6 = 0; var6 < this.interfaces.length; ++var6) {
- FieldDefinition var7 = this.interfaces[var6].getClassDefinition(var1).getVariable(var1, var2);
- if (var7 != null) {
- if (var5 != null && var7 != var5) {
- throw new AmbiguousField(var7, var5);
- }
-
- var5 = var7;
- }
- }
-
- return var5;
- }
-
- public boolean reportDeprecated(Environment var1) {
- return this.isDeprecated() || this.outerClass != null && this.outerClass.reportDeprecated(var1);
- }
-
- public void noteUsedBy(ClassDefinition var1, int var2, Environment var3) {
- if (this.reportDeprecated(var3)) {
- var3.error(var2, "warn.class.is.deprecated", this);
- }
-
- }
-
- public FieldDefinition getInnerClass(Environment var1, Identifier var2) throws ClassNotFound {
- for(FieldDefinition var3 = this.getFirstMatch(var2); var3 != null; var3 = var3.getNextMatch()) {
- if (var3.isInnerClass() && !var3.getInnerClass().isLocal()) {
- return var3;
- }
- }
-
- ClassDeclaration var4 = this.getSuperClass(var1);
- if (var4 != null) {
- return var4.getClassDefinition(var1).getInnerClass(var1, var2);
- } else {
- return null;
- }
- }
-
- private FieldDefinition matchMethod(Environment var1, ClassDefinition var2, Identifier var3, Type[] var4, FieldDefinition var5, boolean var6) throws AmbiguousField, ClassNotFound {
- for(FieldDefinition var7 = this.getFirstMatch(var3); var7 != null; var7 = var7.getNextMatch()) {
- if (var1.isApplicable(var7, var4) && (var2 == null || var2.canAccess(var1, var7))) {
- if (var6) {
- if (var5 == null || var1.isMoreSpecific(var7, var5)) {
- var5 = var7;
- }
- } else if (var7 != var5 && !var1.isMoreSpecific(var5, var7)) {
- throw new AmbiguousField(var5, var7);
- }
- }
- }
-
- if (var3.equals(Constants.idInit)) {
- return var5;
- } else {
- if (var5 == null || !var6) {
- ClassDeclaration var8 = this.getSuperClass();
- if (var8 != null) {
- ClassDefinition var9 = var8.getClassDefinition(var1);
- var5 = var9.matchMethod(var1, var2, var3, var4, var5, var6);
- if (this.isInterface()) {
- ClassDeclaration[] var10 = this.getInterfaces();
-
- for(int var11 = 0; var11 < var10.length; ++var11) {
- var5 = var10[var11].getClassDefinition(var1).matchMethod(var1, var2, var3, var4, var5, var6);
- }
- }
- }
- }
-
- return var5;
- }
- }
-
- public FieldDefinition matchMethod(Environment var1, ClassDefinition var2, Identifier var3, Type[] var4) throws AmbiguousField, ClassNotFound {
- FieldDefinition var5 = this.matchMethod(var1, var2, var3, var4, (FieldDefinition)null, true);
- if (var5 != null) {
- this.matchMethod(var1, var2, var3, var4, var5, false);
- }
-
- return var5;
- }
-
- public FieldDefinition matchMethod(Environment var1, ClassDefinition var2, Identifier var3) throws AmbiguousField, ClassNotFound {
- return this.matchMethod(var1, var2, var3, Type.noArgs);
- }
-
- public FieldDefinition findMethod(Environment var1, Identifier var2, Type var3) throws ClassNotFound {
- for(FieldDefinition var4 = this.getFirstMatch(var2); var4 != null; var4 = var4.getNextMatch()) {
- if (var4.getType().equalArguments(var3)) {
- return var4;
- }
- }
-
- if (var2.equals(Constants.idInit)) {
- return null;
- } else {
- ClassDeclaration var5 = this.getSuperClass();
- return var5 == null ? null : var5.getClassDefinition(var1).findMethod(var1, var2, var3);
- }
- }
-
- protected void basicCheck(Environment var1) throws ClassNotFound {
- if (this.outerClass != null) {
- this.outerClass.basicCheck(var1);
- }
-
- }
-
- public void check(Environment var1) throws ClassNotFound {
- }
-
- public Vset checkLocalClass(Environment var1, Context var2, Vset var3, ClassDefinition var4, Expression[] var5, Type[] var6) throws ClassNotFound {
- throw new CompilerError("checkLocalClass");
- }
-
- public void inlineLocalClass(Environment var1) {
- }
-
- public void resolveTypeStructure(Environment var1) {
- }
-
- public Identifier resolveName(Environment var1, Identifier var2) {
- if (var1.innerClasses()) {
- if (var2.isQualified()) {
- Identifier var7 = this.resolveName(var1, var2.getHead());
- if (!var1.classExists(var7)) {
- return var1.resolvePackageQualifiedName(var2);
- }
-
- try {
- return var1.getClassDefinition(var7).resolveInnerClass(var1, var2.getTail());
- } catch (ClassNotFound var5) {
- return Identifier.lookupInner(var7, var2.getTail());
- }
- }
-
- for(ClassDefinition var3 = this; var3 != null; var3 = var3.outerClass) {
- try {
- FieldDefinition var4 = var3.getInnerClass(var1, var2);
- if (var4 != null) {
- return var4.getInnerClass().getName();
- }
- } catch (ClassNotFound var6) {
- }
- }
- }
-
- return var1.resolveName(var2);
- }
-
- public Identifier resolveInnerClass(Environment var1, Identifier var2) {
- if (var2.isInner()) {
- throw new CompilerError("inner");
- } else if (var2.isQualified()) {
- Identifier var6 = this.resolveInnerClass(var1, var2.getHead());
-
- try {
- return var1.getClassDefinition(var6).resolveInnerClass(var1, var2.getTail());
- } catch (ClassNotFound var4) {
- return Identifier.lookupInner(var6, var2.getTail());
- }
- } else {
- try {
- FieldDefinition var3 = this.getInnerClass(var1, var2);
- if (var3 != null) {
- return var3.getInnerClass().getName();
- }
- } catch (ClassNotFound var5) {
- }
-
- return Identifier.lookupInner(this.getName(), var2);
- }
- }
-
- public boolean innerClassExists(Identifier var1) {
- for(FieldDefinition var2 = this.getFirstMatch(var1.getHead()); var2 != null; var2 = var2.getNextMatch()) {
- if (var2.isInnerClass() && !var2.getInnerClass().isLocal()) {
- if (var1.isQualified() && !var2.getInnerClass().innerClassExists(var1.getTail())) {
- return false;
- }
-
- return true;
- }
- }
-
- return false;
- }
-
- public FieldDefinition findAnyMethod(Environment var1, Identifier var2) throws ClassNotFound {
- for(FieldDefinition var3 = this.getFirstMatch(var2); var3 != null; var3 = var3.getNextMatch()) {
- if (var3.isMethod()) {
- return var3;
- }
- }
-
- ClassDeclaration var4 = this.getSuperClass();
- return var4 == null ? null : var4.getClassDefinition(var1).findAnyMethod(var1, var2);
- }
-
- public int diagnoseMismatch(Environment var1, Identifier var2, Type[] var3, int var4, Type[] var5) throws ClassNotFound {
- int[] var6 = new int[var3.length];
- Type[] var7 = new Type[var3.length];
- if (!this.diagnoseMismatch(var1, var2, var3, var4, var6, var7)) {
- return -2;
- } else {
- for(int var8 = var4; var8 < var3.length; ++var8) {
- if (var6[var8] < 4) {
- var5[0] = var7[var8];
- return var8 << 2 | var6[var8];
- }
- }
-
- return -1;
- }
- }
-
- private boolean diagnoseMismatch(Environment var1, Identifier var2, Type[] var3, int var4, int[] var5, Type[] var6) throws ClassNotFound {
- boolean var7 = false;
-
- for(FieldDefinition var8 = this.getFirstMatch(var2); var8 != null; var8 = var8.getNextMatch()) {
- if (var8.isMethod()) {
- Type[] var9 = var8.getType().getArgumentTypes();
- if (var9.length == var3.length) {
- var7 = true;
-
- for(int var10 = var4; var10 < var3.length; ++var10) {
- Type var11 = var3[var10];
- Type var12 = var9[var10];
- if (var1.implicitCast(var11, var12)) {
- var5[var10] = 4;
- } else {
- if (var5[var10] <= 2 && var1.explicitCast(var11, var12)) {
- if (var5[var10] < 2) {
- var6[var10] = null;
- }
-
- var5[var10] = 2;
- } else if (var5[var10] > 0) {
- continue;
- }
-
- if (var6[var10] == null) {
- var6[var10] = var12;
- } else if (var6[var10] != var12) {
- var5[var10] |= 1;
- }
- }
- }
- }
- }
- }
-
- if (var2.equals(Constants.idInit)) {
- return var7;
- } else {
- ClassDeclaration var13 = this.getSuperClass();
- if (var13 != null && var13.getClassDefinition(var1).diagnoseMismatch(var1, var2, var3, var4, var5, var6)) {
- var7 = true;
- }
-
- return var7;
- }
- }
-
- public void addField(FieldDefinition var1) {
- if (this.firstField == null) {
- this.firstField = this.lastField = var1;
- } else if (var1.isSynthetic() && var1.isFinal() && var1.isVariable()) {
- var1.nextField = this.firstField;
- this.firstField = var1;
- var1.nextMatch = (FieldDefinition)this.fieldHash.get(var1.name);
- } else {
- this.lastField.nextField = var1;
- this.lastField = var1;
- var1.nextMatch = (FieldDefinition)this.fieldHash.get(var1.name);
- }
-
- this.fieldHash.put(var1.name, var1);
- }
-
- public void addField(Environment var1, FieldDefinition var2) {
- this.addField(var2);
- if (this.resolved) {
- var2.resolveTypeStructure(var1);
- }
-
- }
-
- public UplevelReference getReference(LocalField var1) {
- for(UplevelReference var2 = this.references; var2 != null; var2 = var2.getNext()) {
- if (var2.getTarget() == var1) {
- return var2;
- }
- }
-
- return this.addReference(var1);
- }
-
- protected UplevelReference addReference(LocalField var1) {
- if (((FieldDefinition)var1).getClassDefinition() == this) {
- throw new CompilerError("addReference " + var1);
- } else {
- this.referencesMustNotBeFrozen();
- UplevelReference var2 = new UplevelReference(this, var1);
- this.references = var2.insertInto(this.references);
- return var2;
- }
- }
-
- public UplevelReference getReferences() {
- return this.references;
- }
-
- public UplevelReference getReferencesFrozen() {
- this.referencesFrozen = true;
- return this.references;
- }
-
- public final void referencesMustNotBeFrozen() {
- if (this.referencesFrozen) {
- throw new CompilerError("referencesMustNotBeFrozen " + this);
- }
- }
-
- public void addDependency(ClassDeclaration var1) {
- throw new CompilerError("addDependency");
- }
-
- public void print(PrintStream var1) {
- if (this.isPublic()) {
- var1.print("public ");
- }
-
- if (this.isInterface()) {
- var1.print("interface ");
- } else {
- var1.print("class ");
- }
-
- var1.print(this.getName() + " ");
- if (this.getSuperClass() != null) {
- var1.print("extends " + this.getSuperClass().getName() + " ");
- }
-
- if (this.interfaces.length > 0) {
- var1.print("implements ");
-
- for(int var2 = 0; var2 < this.interfaces.length; ++var2) {
- if (var2 > 0) {
- var1.print(", ");
- }
-
- var1.print(this.interfaces[var2].getName());
- var1.print(" ");
- }
- }
-
- var1.println("{");
-
- for(FieldDefinition var3 = this.getFirstField(); var3 != null; var3 = var3.getNextField()) {
- var1.print(" ");
- var3.print(var1);
- }
-
- var1.println("}");
- }
-
- public String toString() {
- return this.getClassDeclaration().toString();
- }
-
- public void cleanup(Environment var1) {
- if (var1.dump()) {
- var1.output("[cleanup " + this.getName() + "]");
- }
-
- for(FieldDefinition var2 = this.getFirstField(); var2 != null; var2 = var2.getNextField()) {
- var2.cleanup(var1);
- }
-
- this.documentation = null;
- }
- }
-