org.aspectj.ajdt.internal.core.builder.EmacsStructureModelManager Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aspectjtools Show documentation
Show all versions of aspectjtools Show documentation
Tools from the AspectJ project
/* *******************************************************************
* Copyright (c) 1999-2001 Xerox Corporation,
* 2002 Palo Alto Research Center, Incorporated (PARC).
* All rights reserved.
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License v1.0
* which accompanies this distribution and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* PARC initial implementation
* ******************************************************************/
package org.aspectj.ajdt.internal.core.builder;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.aspectj.asm.AsmManager;
import org.aspectj.asm.IProgramElement;
/**
* @author Mik Kersten
*/
public class EmacsStructureModelManager {
private static final String EXTERN_FILE_SUFFIX = ".ajesym";
public EmacsStructureModelManager() {
super();
}
public void externalizeModel(AsmManager model) {
if (!model.getHierarchy().isValid())
return;
try {
// Set fileSet = StructureModelManager.INSTANCE.getStructureModel().getFileMap().entrySet();
Set fileSet = model.getHierarchy().getFileMapEntrySet();
for (Iterator it = fileSet.iterator(); it.hasNext();) {
IProgramElement peNode = (IProgramElement) ((Map.Entry) it.next()).getValue();
dumpStructureToFile(peNode);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
// private void dumpStructureToFile(ProgramElementNode node) throws IOException {
// String sourceName = node.getSourceLocation().getSourceFilePath();
// String fileName = sourceName.substring(0, sourceName.lastIndexOf(".")) + EXTERN_FILE_SUFFIX;
// BufferedWriter writer = new BufferedWriter(new FileWriter(new File(fileName)));
// new SExpressionPrinter(writer).printDecls(node);
// writer.flush();
// }
private void dumpStructureToFile(IProgramElement node) throws IOException {
String s = node.getKind().toString();
if (!(s.equals(IProgramElement.Kind.FILE_ASPECTJ.toString()) || s.equals(IProgramElement.Kind.FILE_JAVA.toString()))) {
throw new IllegalArgumentException("externalize file, not " + node);
}
// source files have source locations
String sourceName = node.getSourceLocation().getSourceFile().getAbsolutePath();
String fileName = sourceName.substring(0, sourceName.lastIndexOf(".")) + EXTERN_FILE_SUFFIX;
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(new File(fileName)));
new SExpressionPrinter(writer).printDecls(node);
writer.flush();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
} // ignore
}
}
}
/**
* This class was not written in an OO style.
*/
private static class SExpressionPrinter {
private BufferedWriter writer = null;
public SExpressionPrinter(BufferedWriter writer) {
this.writer = writer;
}
private void printDecls(IProgramElement node) {
print("(");
for (Iterator it = node.getChildren().iterator(); it.hasNext();) {
// this ignores relations on the compile unit
Object nodeObject = it.next();
// throw new RuntimeException("unimplemented");
// if (nodeObject instanceof IProgramElement) {
IProgramElement child = (IProgramElement) nodeObject;
printDecl(child, true);
// }
// else if (nodeObject instanceof LinkNode) {
// LinkNode child = (LinkNode)nodeObject;
// printDecl(child.getProgramElementNode(), false);
// }
}
print(") ");
}
// private void printDecls(IRelationship node) {
// // for (Iterator it = node.getTargets().iterator(); it.hasNext(); ) {
// // // this ignores relations on the compile unit
// // Object nodeObject = it.next();
// // throw new RuntimeException("unimplemented");
// //// if (nodeObject instanceof LinkNode) {
// //// LinkNode child = (LinkNode)nodeObject;
// //// if (//!child.getProgramElementNode().getKind().equals("stmnt") &&
// //// !child.getProgramElementNode().getKind().equals("")) {
// //// printDecl(child.getProgramElementNode(), false);
// ////// printDecl(child.getProgramElementNode(), false);
// //// }
// //// }
// // }
// }
/**
* @param structureNode can be a ProgramElementNode or a LinkNode
*/
private void printDecl(IProgramElement node, boolean recurse) {
if (node == null || node.getSourceLocation() == null)
return;
String kind = node.getKind().toString().toLowerCase();
print("(");
print("(" + node.getSourceLocation().getLine() + " . " + node.getSourceLocation().getColumn() + ") ");
print("(" + node.getSourceLocation().getLine() + " . " + node.getSourceLocation().getColumn() + ") ");
print(kind + " "); // 2
// HACK:
String displayName = node.toString().replace('\"', ' ');
print("\"" + displayName + "\" ");
if (node.getSourceLocation().getSourceFile().getAbsolutePath() != null) {
print("\"" + fixFilename(node.getSourceLocation().getSourceFile().getAbsolutePath()) + "\""); // 4
} else {
print("nil");
}
if (node.getName() != null) {
print("\"" + node.getDeclaringType() + "\" "); // 5
} else {
print("nil");
}
if (!recurse) {
print("nil");
print("nil");
print("nil");
} else {
print("(");
// if (node instanceof IProgramElement) {
// java.util.List relations = ((IProgramElement)node).getRelations();
// if (relations != null) {
// for (Iterator it = relations.iterator(); it.hasNext(); ) {
// IRelationship relNode = (IRelationship)it.next();
// if (relNode.getKind() == IRelationship.Kind.ADVICE ||
// relNode.getKind() == IRelationship.Kind.DECLARE) {
// printDecls(relNode); // 6
// }
// }
// }
// }
print(") ");
print("(");
print(") ");
print("(");
Iterator it3 = node.getChildren().iterator();
if (it3.hasNext()) {
while (it3.hasNext()) {
// this ignores relations on the compile unit
Object nodeObject = it3.next();
if (nodeObject instanceof IProgramElement) {
IProgramElement currNode = (IProgramElement) nodeObject;
if (// !currNode.isStmntKind() &&
!currNode.getKind().equals("")) {
printDecl(currNode, true);
}
}
}
}
print(") ");
}
print(node.getKind().equals("class") ? "t " : "nil "); // 9
// print(node.getKind().equals("introduction") ? "t " : "nil "); // 10
print(node.getKind().equals("introduction") ? "nil " : "nil "); // 10
print("nil "); // 11
print("nil "); // 12
print(")");
}
String fixFilename(String filename) {
return subst("\\\\", "\\", filename);
}
private void print(String string) {
try {
writer.write(string + "\n");
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
private String subst(String n, String o, String in) {
int pos = in.indexOf(o);
if (pos == -1)
return in;
return in.substring(0, pos) + n + subst(n, o, (in.substring(pos + o.length())));
}
// private void lose(Error e) {
// try {
// print("(ERROR \"" + e.toString() + "\")");
// }
// catch(Error ex) { }
// }
}
}