001 package serp.bytecode;
002
003 import java.io.*;
004
005 import serp.bytecode.lowlevel.*;
006 import serp.bytecode.visitor.*;
007
008 /**
009 * Attribute naming the source file for this class.
010 *
011 * @author Abe White
012 */
013 public class SourceFile extends Attribute {
014 int _sourceFileIndex = 0;
015
016 SourceFile(int nameIndex, Attributes owner) {
017 super(nameIndex, owner);
018 }
019
020 int getLength() {
021 return 2;
022 }
023
024 /**
025 * Return the index into the class {@link ConstantPool} of the
026 * {@link UTF8Entry} naming the source file for this class, or 0 if not set.
027 */
028 public int getFileIndex() {
029 return _sourceFileIndex;
030 }
031
032 /**
033 * Set the index into the class {@link ConstantPool} of the
034 * {@link UTF8Entry} naming the source file for this class.
035 */
036 public void setFileIndex(int sourceFileIndex) {
037 if (sourceFileIndex < 0)
038 sourceFileIndex = 0;
039 _sourceFileIndex = sourceFileIndex;
040 }
041
042 /**
043 * Return the name of the source file, or null if not set.
044 */
045 public String getFileName() {
046 if (_sourceFileIndex == 0)
047 return null;
048 return ((UTF8Entry) getPool().getEntry(_sourceFileIndex)).getValue();
049 }
050
051 /**
052 * Return the file object for the source file, or null if not set.
053 *
054 * @param dir the directory of the file, or null
055 */
056 public File getFile(File dir) {
057 String name = getFileName();
058 if (name == null)
059 return null;
060 return new File(dir, name);
061 }
062
063 /**
064 * Set the name of the source file. The name should be the file name
065 * only; it should not include the path to the file.
066 */
067 public void setFile(String name) {
068 if (name == null)
069 setFileIndex(0);
070 else
071 setFileIndex(getPool().findUTF8Entry(name, true));
072 }
073
074 /**
075 * Set the source file. Note that only the file name is recorded;
076 * the path to the file is discarded.
077 */
078 public void setFile(File file) {
079 if (file == null)
080 setFile((String) null);
081 else
082 setFile(file.getName());
083 }
084
085 /**
086 * Set the file name from the current class name plus the .java extension.
087 */
088 public void setFromClassName() {
089 setFile(((BCClass) getOwner()).getClassName() + ".java");
090 }
091
092 public void acceptVisit(BCVisitor visit) {
093 visit.enterSourceFile(this);
094 visit.exitSourceFile(this);
095 }
096
097 void read(Attribute other) {
098 setFile(((SourceFile) other).getFileName());
099 }
100
101 void read(DataInput in, int length) throws IOException {
102 setFileIndex(in.readUnsignedShort());
103 }
104
105 void write(DataOutput out, int length) throws IOException {
106 out.writeShort(getFileIndex());
107 }
108 }