00001 package edu.ksu.cis.bandera.jjjc.analysis;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 import java.util.*;
00036 import edu.ksu.cis.bandera.jjjc.node.*;
00037 import edu.ksu.cis.bandera.jjjc.analysis.*;
00038 import edu.ksu.cis.bandera.jjjc.exception.*;
00039 import edu.ksu.cis.bandera.jjjc.symboltable.*;
00040 import edu.ksu.cis.bandera.jjjc.util.*;
00041
00042 public class ClassOrInterfaceAnalysis extends DepthFirstAdapter {
00043 private SymbolTable symbolTable;
00044 private Vector exceptions = new Vector();
00045 private ClassOrInterfaceType currentClassOrInterfaceType = null;
00046
00047
00048
00049
00050 public ClassOrInterfaceAnalysis(SymbolTable symbolTable) {
00051 this.symbolTable = symbolTable;
00052 }
00053
00054
00055
00056
00057 public void caseAClassDeclaration(AClassDeclaration node) {
00058 try {
00059 currentClassOrInterfaceType = symbolTable.getDeclaredType(new Name(node.getId().toString()));
00060
00061 if (currentClassOrInterfaceType.isLoaded()) return;
00062
00063 symbolTable.setCurrentClassOrInterfaceType(currentClassOrInterfaceType);
00064
00065 Name className = currentClassOrInterfaceType.getName();
00066
00067
00068 if (node.getModifier() != null) {
00069 currentClassOrInterfaceType.setModifiers(Util.convertModifiers(node.getModifier().toString()));
00070 }
00071
00072 Name objectName = new Name("Object");
00073
00074
00075
00076
00077
00078 Name superClassName = null;
00079 ClassOrInterfaceType superClassType = null;
00080
00081 if ((node.getSuper() == null) || (((ASuper)node.getSuper()).getClassType() == null)) {
00082 if (!className.equals(objectName) && !className.equals("java.lang.Object")) {
00083 superClassName = objectName;
00084 superClassType = symbolTable.resolveClassOrInterfaceType(superClassName);
00085 }
00086 } else {
00087 superClassName = new Name((((ASuper)node.getSuper()).getClassType().toString()));
00088 if (superClassName.equals(className))
00089 throw new ClassCircularityException("Class named '" + className + "' extends itself");
00090 superClassType = symbolTable.resolveClassOrInterfaceType(superClassName);
00091 }
00092
00093 currentClassOrInterfaceType.setSuperClass(superClassType);
00094
00095 if (node.getInterfaces() != null && ((AInterfaces)node.getInterfaces()).getName() != null) {
00096 Object[] superInterfaces = ((AInterfaces)node.getInterfaces()).getName().toArray();
00097 for(int i = 0; i < superInterfaces.length; i++) {
00098 ClassOrInterfaceType superInterface =
00099 symbolTable.resolveClassOrInterfaceType(new Name(superInterfaces[i].toString()));
00100 currentClassOrInterfaceType.addSuperInterface(superInterface);
00101 }
00102 }
00103 } catch (CompilerException e) {
00104 exceptions.addElement(e);
00105 }
00106 symbolTable.setCurrentClassOrInterfaceType(null);
00107 }
00108
00109
00110
00111
00112 public void caseAInterfaceDeclaration(AInterfaceDeclaration node) {
00113 try {
00114 currentClassOrInterfaceType = symbolTable.getDeclaredType(new Name(node.getId().toString()));
00115 if (currentClassOrInterfaceType.isLoaded()) return;
00116 symbolTable.setCurrentClassOrInterfaceType(currentClassOrInterfaceType);
00117
00118 if (node.getModifier() != null) {
00119 currentClassOrInterfaceType.setModifiers(Util.convertModifiers(node.getModifier().toString()));
00120 }
00121
00122 if (node.getName() != null) {
00123 Object[] superInterfaces = node.getName().toArray();
00124
00125 for(int i = 0; i < superInterfaces.length; i++) {
00126 ClassOrInterfaceType superInterface =
00127 symbolTable.resolveClassOrInterfaceType(new Name(superInterfaces[i].toString()));
00128 currentClassOrInterfaceType.addSuperInterface(superInterface);
00129 }
00130 }
00131 } catch (CompilerException e) {
00132 exceptions.addElement(e);
00133 }
00134
00135 symbolTable.setCurrentClassOrInterfaceType(null);
00136 }
00137
00138
00139
00140
00141 public Enumeration getExceptions() {
00142 return exceptions.elements();
00143 }
00144 }