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.symboltable.Package;
00041
00042 public class CompilationUnitAnalysis extends DepthFirstAdapter {
00043 private SymbolTable symbolTable;
00044 private Vector exceptions = new Vector();
00045
00046
00047
00048
00049 public CompilationUnitAnalysis(SymbolTable symbolTable) {
00050 this.symbolTable = symbolTable;
00051 }
00052
00053
00054
00055 public void caseAClassDeclaration(AClassDeclaration node) {
00056 try {
00057 ClassOrInterfaceType type = symbolTable.declareType(new Name(node.getId().toString()));
00058 type.setPath(symbolTable.getPath());
00059 if (type.isLoaded()) return;
00060 type.setLoadingState();
00061 type.setInterface(false);
00062 type.setSymbolTable(symbolTable);
00063 } catch (CompilerException e) {
00064 exceptions.addElement(e);
00065 }
00066 }
00067
00068
00069
00070
00071 public void caseACompilationUnit(ACompilationUnit node) {
00072 if (node.getPackageDeclaration() != null) {
00073 try {
00074 symbolTable.setCurrentPackage(Package.getPackage(new Name(node.getPackageDeclaration().toString())));
00075 } catch (InvalidNameException ine) {
00076 exceptions.addElement(ine);
00077 }
00078 } else {
00079 try {
00080 symbolTable.setCurrentPackage(Package.getPackage(new Name("")));
00081 } catch (InvalidNameException ine) {
00082 exceptions.addElement(ine);
00083 }
00084 }
00085 {
00086 Object temp[] = node.getImportDeclaration().toArray();
00087 for (int i = 0; i < temp.length; i++) {
00088 ((PImportDeclaration) temp[i]).apply(this);
00089 }
00090 }
00091 {
00092 Object temp[] = node.getTypeDeclaration().toArray();
00093 for (int i = 0; i < temp.length; i++) {
00094 ((PTypeDeclaration) temp[i]).apply(this);
00095 }
00096 }
00097 }
00098
00099
00100
00101 public void caseAInterfaceDeclaration(AInterfaceDeclaration node) {
00102 try {
00103 ClassOrInterfaceType type = symbolTable.declareType(new Name(node.getId().toString()));
00104 if (type.isLoaded()) return;
00105 type.setLoadingState();
00106 type.setInterface(true);
00107 } catch (CompilerException e) {
00108 exceptions.addElement(e);
00109 }
00110 }
00111
00112
00113
00114 public void caseAPackageDeclaration(APackageDeclaration node) {
00115 try {
00116 symbolTable.setCurrentPackage(Package.getPackage(new Name(node.getName().toString())));
00117 } catch (InvalidNameException ine) {
00118 exceptions.addElement(ine);
00119 }
00120 }
00121
00122
00123
00124
00125 public void caseASingleTypeImportDeclaration(ASingleTypeImportDeclaration node) {
00126 try {
00127 symbolTable.importType(new Name(node.getName().toString()));
00128 } catch (CompilerException e) {
00129 exceptions.addElement(e);
00130 }
00131 }
00132
00133
00134
00135
00136 public void caseATypeOnDemandImportDeclaration(ATypeOnDemandImportDeclaration node) {
00137 try {
00138 symbolTable.importTypeOnDemand(new Name(node.getName().toString()));
00139 } catch (CompilerException e) {
00140 exceptions.addElement(e);
00141 }
00142 }
00143
00144
00145
00146
00147 public Enumeration getExceptions() {
00148 return exceptions.elements();
00149 }
00150 }